From 1a5fab87c6dc2087f3a5d50c69c84bdadee08731 Mon Sep 17 00:00:00 2001 From: Michael McGuinness Date: Mon, 23 Dec 2024 16:49:53 +0000 Subject: [PATCH] validate inputs --- api/grpc/controllers/export.go | 10 +- api/grpc/controllers/jobcollector.go | 6 +- api/grpc/controllers/query.go | 10 +- api/queue/document.go | 15 +- cmd/grpc/main.go | 8 +- cmd/queue/main.go | 4 +- go.mod | 5 + go.sum | 12 + internal/document/service.go | 10 +- test/integration/grpc/container_test.go | 6 - test/integration/grpc/query_test.go | 2 +- test/integration/queue/container_test.go | 6 - test/integration/queue/querysync_test.go | 2 +- .../Azure/go-ansiterm/winterm/ansi.go | 1 - .../Azure/go-ansiterm/winterm/api.go | 1 - .../go-ansiterm/winterm/attr_translation.go | 1 - .../go-ansiterm/winterm/cursor_helpers.go | 1 - .../go-ansiterm/winterm/erase_helpers.go | 1 - .../go-ansiterm/winterm/scroll_helper.go | 1 - .../Azure/go-ansiterm/winterm/utilities.go | 1 - .../go-ansiterm/winterm/win_event_handler.go | 1 - .../aws/smithy-go/document/document.go | 39 +- .../aws/smithy-go/encoding/xml/doc.go | 10 +- .../aws/smithy-go/middleware/doc.go | 20 +- .../aws/smithy-go/middleware/stack.go | 4 +- .../cenkalti/backoff/v4/exponential.go | 38 +- .../github.com/davecgh/go-spew/spew/bypass.go | 1 - .../davecgh/go-spew/spew/bypasssafe.go | 1 - .../github.com/davecgh/go-spew/spew/config.go | 30 +- vendor/github.com/davecgh/go-spew/spew/doc.go | 128 +- .../github.com/davecgh/go-spew/spew/dump.go | 18 +- .../httpsnoop/wrap_generated_gteq_1.8.go | 2 - .../httpsnoop/wrap_generated_lt_1.8.go | 2 - .../gabriel-vasile/mimetype/.gitattributes | 1 + .../mimetype/CODE_OF_CONDUCT.md | 76 + .../gabriel-vasile/mimetype/CONTRIBUTING.md | 12 + .../gabriel-vasile/mimetype/LICENSE | 21 + .../gabriel-vasile/mimetype/README.md | 105 + .../mimetype/internal/charset/charset.go | 309 + .../mimetype/internal/json/json.go | 544 ++ .../mimetype/internal/magic/archive.go | 124 + .../mimetype/internal/magic/audio.go | 76 + .../mimetype/internal/magic/binary.go | 198 + .../mimetype/internal/magic/database.go | 13 + .../mimetype/internal/magic/document.go | 62 + .../mimetype/internal/magic/font.go | 39 + .../mimetype/internal/magic/ftyp.go | 88 + .../mimetype/internal/magic/geo.go | 55 + .../mimetype/internal/magic/image.go | 110 + .../mimetype/internal/magic/magic.go | 241 + .../mimetype/internal/magic/ms_office.go | 225 + .../mimetype/internal/magic/ogg.go | 42 + .../mimetype/internal/magic/text.go | 375 ++ .../mimetype/internal/magic/text_csv.go | 63 + .../mimetype/internal/magic/video.go | 85 + .../mimetype/internal/magic/zip.go | 92 + .../gabriel-vasile/mimetype/mime.go | 186 + .../gabriel-vasile/mimetype/mimetype.gif | Bin 0 -> 1343768 bytes .../gabriel-vasile/mimetype/mimetype.go | 124 + .../mimetype/supported_mimes.md | 178 + .../gabriel-vasile/mimetype/tree.go | 260 + vendor/github.com/go-ole/go-ole/com.go | 1 - vendor/github.com/go-ole/go-ole/com_func.go | 1 - vendor/github.com/go-ole/go-ole/error_func.go | 1 - .../github.com/go-ole/go-ole/error_windows.go | 1 - vendor/github.com/go-ole/go-ole/guid.go | 10 +- .../go-ole/go-ole/iconnectionpoint_func.go | 1 - .../go-ole/go-ole/iconnectionpoint_windows.go | 1 - .../go-ole/iconnectionpointcontainer_func.go | 1 - .../iconnectionpointcontainer_windows.go | 1 - .../go-ole/go-ole/idispatch_func.go | 1 - .../go-ole/go-ole/ienumvariant_func.go | 1 - .../go-ole/go-ole/ienumvariant_windows.go | 1 - .../go-ole/go-ole/iinspectable_func.go | 1 - .../go-ole/go-ole/iinspectable_windows.go | 1 - .../go-ole/go-ole/iprovideclassinfo_func.go | 1 - .../go-ole/iprovideclassinfo_windows.go | 1 - .../go-ole/go-ole/itypeinfo_func.go | 1 - .../go-ole/go-ole/itypeinfo_windows.go | 1 - .../github.com/go-ole/go-ole/iunknown_func.go | 1 - .../go-ole/go-ole/iunknown_windows.go | 1 - .../go-ole/go-ole/oleutil/connection.go | 1 - .../go-ole/go-ole/oleutil/connection_func.go | 1 - .../go-ole/oleutil/connection_windows.go | 1 - .../go-ole/go-ole/oleutil/go-get.go | 1 - .../go-ole/go-ole/safearray_func.go | 1 - .../go-ole/go-ole/safearray_windows.go | 1 - .../go-ole/go-ole/safearrayconversion.go | 2 +- .../go-ole/go-ole/safearrayslices.go | 1 - vendor/github.com/go-ole/go-ole/variables.go | 1 - .../github.com/go-ole/go-ole/variant_386.go | 1 - .../github.com/go-ole/go-ole/variant_amd64.go | 1 - .../github.com/go-ole/go-ole/variant_arm.go | 1 - .../go-ole/go-ole/variant_date_386.go | 1 - .../go-ole/go-ole/variant_date_amd64.go | 1 - .../go-ole/go-ole/variant_date_arm.go | 1 - .../go-ole/go-ole/variant_ppc64le.go | 1 - .../github.com/go-ole/go-ole/variant_s390x.go | 1 - vendor/github.com/go-ole/go-ole/winrt.go | 1 - vendor/github.com/go-ole/go-ole/winrt_doc.go | 1 - .../go-playground/locales/.gitignore | 24 + .../go-playground/locales/.travis.yml | 26 + .../github.com/go-playground/locales/LICENSE | 21 + .../go-playground/locales/README.md | 170 + .../locales/currency/currency.go | 311 + .../github.com/go-playground/locales/logo.png | Bin 0 -> 37356 bytes .../github.com/go-playground/locales/rules.go | 293 + .../universal-translator/.gitignore | 25 + .../universal-translator/.travis.yml | 27 + .../universal-translator/LICENSE | 21 + .../universal-translator/Makefile | 18 + .../universal-translator/README.md | 87 + .../universal-translator/errors.go | 148 + .../universal-translator/import_export.go | 274 + .../universal-translator/logo.png | Bin 0 -> 16597 bytes .../universal-translator/translator.go | 420 ++ .../universal_translator.go | 113 + .../go-playground/validator/v10/.gitignore | 32 + .../go-playground/validator/v10/LICENSE | 22 + .../validator/v10/MAINTAINERS.md | 16 + .../go-playground/validator/v10/Makefile | 18 + .../go-playground/validator/v10/README.md | 359 ++ .../go-playground/validator/v10/baked_in.go | 3046 +++++++++ .../go-playground/validator/v10/cache.go | 332 + .../validator/v10/country_codes.go | 1177 ++++ .../validator/v10/currency_codes.go | 79 + .../go-playground/validator/v10/doc.go | 1498 +++++ .../go-playground/validator/v10/errors.go | 276 + .../validator/v10/field_level.go | 120 + .../go-playground/validator/v10/logo.png | Bin 0 -> 13442 bytes .../go-playground/validator/v10/options.go | 26 + .../validator/v10/postcode_regexes.go | 179 + .../go-playground/validator/v10/regexes.go | 163 + .../validator/v10/struct_level.go | 175 + .../validator/v10/translations.go | 11 + .../go-playground/validator/v10/util.go | 312 + .../go-playground/validator/v10/validator.go | 510 ++ .../validator/v10/validator_instance.go | 710 +++ vendor/github.com/gogo/protobuf/proto/lib.go | 36 +- .../gogo/protobuf/proto/pointer_reflect.go | 1 - .../protobuf/proto/pointer_reflect_gogo.go | 1 - .../gogo/protobuf/proto/pointer_unsafe.go | 1 - .../protobuf/proto/pointer_unsafe_gogo.go | 1 - .../gogo/protobuf/proto/table_unmarshal.go | 14 +- vendor/github.com/google/uuid/dce.go | 4 +- vendor/github.com/google/uuid/hash.go | 4 +- vendor/github.com/google/uuid/node_js.go | 1 - vendor/github.com/google/uuid/node_net.go | 1 - vendor/github.com/google/uuid/null.go | 17 +- vendor/github.com/google/uuid/uuid.go | 10 +- vendor/github.com/google/uuid/version4.go | 14 +- vendor/github.com/leodido/go-urn/.gitignore | 13 + vendor/github.com/leodido/go-urn/LICENSE | 21 + vendor/github.com/leodido/go-urn/README.md | 153 + vendor/github.com/leodido/go-urn/kind.go | 10 + vendor/github.com/leodido/go-urn/machine.go | 5046 +++++++++++++++ .../github.com/leodido/go-urn/machine.go.rl | 386 ++ vendor/github.com/leodido/go-urn/makefile | 51 + vendor/github.com/leodido/go-urn/options.go | 9 + .../github.com/leodido/go-urn/parsing_mode.go | 12 + vendor/github.com/leodido/go-urn/scim.go | 48 + .../leodido/go-urn/scim/schema/type.go | 36 + vendor/github.com/leodido/go-urn/urn.go | 141 + vendor/github.com/leodido/go-urn/urn8141.go | 30 + vendor/github.com/lib/pq/array.go | 7 +- vendor/github.com/lib/pq/doc.go | 105 +- vendor/github.com/lib/pq/notify.go | 22 +- vendor/github.com/lib/pq/scram/scram.go | 25 +- .../opencontainers/go-digest/digest.go | 2 +- .../opencontainers/go-digest/doc.go | 11 +- .../pashagolub/pgxmock/v3/argument.go | 1 + vendor/github.com/pkg/errors/errors.go | 74 +- vendor/github.com/pkg/errors/go113.go | 1 - vendor/github.com/pkg/errors/stack.go | 20 +- .../pmezard/go-difflib/difflib/difflib.go | 13 +- vendor/github.com/sirupsen/logrus/doc.go | 26 +- .../github.com/sirupsen/logrus/formatter.go | 4 +- vendor/github.com/sirupsen/logrus/logger.go | 18 +- .../logrus/terminal_check_appengine.go | 1 - .../sirupsen/logrus/terminal_check_bsd.go | 1 - .../sirupsen/logrus/terminal_check_js.go | 1 - .../logrus/terminal_check_no_terminal.go | 1 - .../logrus/terminal_check_notappengine.go | 1 - .../sirupsen/logrus/terminal_check_unix.go | 1 - .../sirupsen/logrus/terminal_check_windows.go | 1 - vendor/github.com/tidwall/match/match.go | 12 +- vendor/github.com/yusufpapurcu/wmi/wmi.go | 2 +- .../proto/otlp/trace/v1/trace.pb.go | 2 +- vendor/go.uber.org/atomic/nocmp.go | 12 +- vendor/golang.org/x/crypto/sha3/doc.go | 66 + vendor/golang.org/x/crypto/sha3/hashes.go | 128 + .../golang.org/x/crypto/sha3/hashes_noasm.go | 23 + vendor/golang.org/x/crypto/sha3/keccakf.go | 414 ++ .../golang.org/x/crypto/sha3/keccakf_amd64.go | 13 + .../golang.org/x/crypto/sha3/keccakf_amd64.s | 5419 +++++++++++++++++ vendor/golang.org/x/crypto/sha3/sha3.go | 244 + vendor/golang.org/x/crypto/sha3/sha3_s390x.go | 303 + vendor/golang.org/x/crypto/sha3/sha3_s390x.s | 33 + vendor/golang.org/x/crypto/sha3/shake.go | 193 + .../golang.org/x/crypto/sha3/shake_noasm.go | 15 + vendor/golang.org/x/net/html/atom/atom.go | 78 + vendor/golang.org/x/net/html/atom/table.go | 783 +++ vendor/golang.org/x/net/html/const.go | 111 + vendor/golang.org/x/net/html/doc.go | 122 + vendor/golang.org/x/net/html/doctype.go | 156 + vendor/golang.org/x/net/html/entity.go | 2253 +++++++ vendor/golang.org/x/net/html/escape.go | 339 ++ vendor/golang.org/x/net/html/foreign.go | 222 + vendor/golang.org/x/net/html/iter.go | 56 + vendor/golang.org/x/net/html/node.go | 229 + vendor/golang.org/x/net/html/parse.go | 2460 ++++++++ vendor/golang.org/x/net/html/render.go | 293 + vendor/golang.org/x/net/html/token.go | 1272 ++++ vendor/gopkg.in/yaml.v3/apic.go | 8 +- vendor/gopkg.in/yaml.v3/emitterc.go | 9 +- vendor/gopkg.in/yaml.v3/parserc.go | 140 +- vendor/gopkg.in/yaml.v3/readerc.go | 8 +- vendor/gopkg.in/yaml.v3/scannerc.go | 42 +- vendor/gopkg.in/yaml.v3/writerc.go | 8 +- vendor/gopkg.in/yaml.v3/yaml.go | 75 +- vendor/gopkg.in/yaml.v3/yamlh.go | 10 +- vendor/gopkg.in/yaml.v3/yamlprivateh.go | 20 +- vendor/modules.txt | 23 + 223 files changed, 36539 insertions(+), 643 deletions(-) create mode 100644 vendor/github.com/gabriel-vasile/mimetype/.gitattributes create mode 100644 vendor/github.com/gabriel-vasile/mimetype/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/gabriel-vasile/mimetype/CONTRIBUTING.md create mode 100644 vendor/github.com/gabriel-vasile/mimetype/LICENSE create mode 100644 vendor/github.com/gabriel-vasile/mimetype/README.md create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/charset/charset.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/json/json.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/archive.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/audio.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/database.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/document.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/font.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/ftyp.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/geo.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/image.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/ms_office.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/ogg.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/text.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/text_csv.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/video.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/zip.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/mime.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/mimetype.gif create mode 100644 vendor/github.com/gabriel-vasile/mimetype/mimetype.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md create mode 100644 vendor/github.com/gabriel-vasile/mimetype/tree.go create mode 100644 vendor/github.com/go-playground/locales/.gitignore create mode 100644 vendor/github.com/go-playground/locales/.travis.yml create mode 100644 vendor/github.com/go-playground/locales/LICENSE create mode 100644 vendor/github.com/go-playground/locales/README.md create mode 100644 vendor/github.com/go-playground/locales/currency/currency.go create mode 100644 vendor/github.com/go-playground/locales/logo.png create mode 100644 vendor/github.com/go-playground/locales/rules.go create mode 100644 vendor/github.com/go-playground/universal-translator/.gitignore create mode 100644 vendor/github.com/go-playground/universal-translator/.travis.yml create mode 100644 vendor/github.com/go-playground/universal-translator/LICENSE create mode 100644 vendor/github.com/go-playground/universal-translator/Makefile create mode 100644 vendor/github.com/go-playground/universal-translator/README.md create mode 100644 vendor/github.com/go-playground/universal-translator/errors.go create mode 100644 vendor/github.com/go-playground/universal-translator/import_export.go create mode 100644 vendor/github.com/go-playground/universal-translator/logo.png create mode 100644 vendor/github.com/go-playground/universal-translator/translator.go create mode 100644 vendor/github.com/go-playground/universal-translator/universal_translator.go create mode 100644 vendor/github.com/go-playground/validator/v10/.gitignore create mode 100644 vendor/github.com/go-playground/validator/v10/LICENSE create mode 100644 vendor/github.com/go-playground/validator/v10/MAINTAINERS.md create mode 100644 vendor/github.com/go-playground/validator/v10/Makefile create mode 100644 vendor/github.com/go-playground/validator/v10/README.md create mode 100644 vendor/github.com/go-playground/validator/v10/baked_in.go create mode 100644 vendor/github.com/go-playground/validator/v10/cache.go create mode 100644 vendor/github.com/go-playground/validator/v10/country_codes.go create mode 100644 vendor/github.com/go-playground/validator/v10/currency_codes.go create mode 100644 vendor/github.com/go-playground/validator/v10/doc.go create mode 100644 vendor/github.com/go-playground/validator/v10/errors.go create mode 100644 vendor/github.com/go-playground/validator/v10/field_level.go create mode 100644 vendor/github.com/go-playground/validator/v10/logo.png create mode 100644 vendor/github.com/go-playground/validator/v10/options.go create mode 100644 vendor/github.com/go-playground/validator/v10/postcode_regexes.go create mode 100644 vendor/github.com/go-playground/validator/v10/regexes.go create mode 100644 vendor/github.com/go-playground/validator/v10/struct_level.go create mode 100644 vendor/github.com/go-playground/validator/v10/translations.go create mode 100644 vendor/github.com/go-playground/validator/v10/util.go create mode 100644 vendor/github.com/go-playground/validator/v10/validator.go create mode 100644 vendor/github.com/go-playground/validator/v10/validator_instance.go create mode 100644 vendor/github.com/leodido/go-urn/.gitignore create mode 100644 vendor/github.com/leodido/go-urn/LICENSE create mode 100644 vendor/github.com/leodido/go-urn/README.md create mode 100644 vendor/github.com/leodido/go-urn/kind.go create mode 100644 vendor/github.com/leodido/go-urn/machine.go create mode 100644 vendor/github.com/leodido/go-urn/machine.go.rl create mode 100644 vendor/github.com/leodido/go-urn/makefile create mode 100644 vendor/github.com/leodido/go-urn/options.go create mode 100644 vendor/github.com/leodido/go-urn/parsing_mode.go create mode 100644 vendor/github.com/leodido/go-urn/scim.go create mode 100644 vendor/github.com/leodido/go-urn/scim/schema/type.go create mode 100644 vendor/github.com/leodido/go-urn/urn.go create mode 100644 vendor/github.com/leodido/go-urn/urn8141.go create mode 100644 vendor/golang.org/x/crypto/sha3/doc.go create mode 100644 vendor/golang.org/x/crypto/sha3/hashes.go create mode 100644 vendor/golang.org/x/crypto/sha3/hashes_noasm.go create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf.go create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf_amd64.go create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf_amd64.s create mode 100644 vendor/golang.org/x/crypto/sha3/sha3.go create mode 100644 vendor/golang.org/x/crypto/sha3/sha3_s390x.go create mode 100644 vendor/golang.org/x/crypto/sha3/sha3_s390x.s create mode 100644 vendor/golang.org/x/crypto/sha3/shake.go create mode 100644 vendor/golang.org/x/crypto/sha3/shake_noasm.go create mode 100644 vendor/golang.org/x/net/html/atom/atom.go create mode 100644 vendor/golang.org/x/net/html/atom/table.go create mode 100644 vendor/golang.org/x/net/html/const.go create mode 100644 vendor/golang.org/x/net/html/doc.go create mode 100644 vendor/golang.org/x/net/html/doctype.go create mode 100644 vendor/golang.org/x/net/html/entity.go create mode 100644 vendor/golang.org/x/net/html/escape.go create mode 100644 vendor/golang.org/x/net/html/foreign.go create mode 100644 vendor/golang.org/x/net/html/iter.go create mode 100644 vendor/golang.org/x/net/html/node.go create mode 100644 vendor/golang.org/x/net/html/parse.go create mode 100644 vendor/golang.org/x/net/html/render.go create mode 100644 vendor/golang.org/x/net/html/token.go diff --git a/api/grpc/controllers/export.go b/api/grpc/controllers/export.go index 6b8932fd..fc319649 100644 --- a/api/grpc/controllers/export.go +++ b/api/grpc/controllers/export.go @@ -4,16 +4,20 @@ import ( "context" "gotemplate/api/grpc/spec" "gotemplate/internal/export" + + "github.com/go-playground/validator/v10" ) type ExportController struct { spec.UnimplementedExportServiceServer - export export.Service + export export.Service + validator *validator.Validate } -func NewExportController(exportSvc export.Service) *ExportController { +func NewExportController(exportSvc export.Service, validator *validator.Validate) *ExportController { return &ExportController{ - export: exportSvc, + export: exportSvc, + validator: validator, } } diff --git a/api/grpc/controllers/jobcollector.go b/api/grpc/controllers/jobcollector.go index 6c82a357..ef4d75c0 100644 --- a/api/grpc/controllers/jobcollector.go +++ b/api/grpc/controllers/jobcollector.go @@ -5,17 +5,21 @@ import ( "gotemplate/api/grpc/spec" "gotemplate/internal/collector" + "github.com/go-playground/validator/v10" + "google.golang.org/protobuf/types/known/emptypb" ) type JobCollectorController struct { spec.UnimplementedJobCollectorServiceServer collector collector.Service + validator *validator.Validate } -func NewJobCollectorController(collSvc collector.Service) *JobCollectorController { +func NewJobCollectorController(collSvc collector.Service, validator *validator.Validate) *JobCollectorController { return &JobCollectorController{ collector: collSvc, + validator: validator, } } diff --git a/api/grpc/controllers/query.go b/api/grpc/controllers/query.go index 5ac3e3dd..6ac01297 100644 --- a/api/grpc/controllers/query.go +++ b/api/grpc/controllers/query.go @@ -5,17 +5,21 @@ import ( "gotemplate/api/grpc/spec" "gotemplate/internal/query" + "github.com/go-playground/validator/v10" + "google.golang.org/protobuf/types/known/emptypb" ) type QueryController struct { spec.UnimplementedQueryServiceServer - query query.Service + query query.Service + validator *validator.Validate } -func NewQueryController(querySvc query.Service) *QueryController { +func NewQueryController(querySvc query.Service, validator *validator.Validate) *QueryController { return &QueryController{ - query: querySvc, + query: querySvc, + validator: validator, } } diff --git a/api/queue/document.go b/api/queue/document.go index 236d46a6..2e390988 100644 --- a/api/queue/document.go +++ b/api/queue/document.go @@ -6,17 +6,21 @@ import ( "gotemplate/internal/document" "gotemplate/internal/queue" + "github.com/go-playground/validator/v10" + "github.com/aws/aws-sdk-go-v2/service/sqs/types" "github.com/google/uuid" ) type DocumentController struct { - document document.Service + validator *validator.Validate + document document.Service } -func NewDocumentController(svc document.Service) *DocumentController { +func NewDocumentController(svc document.Service, validator *validator.Validate) *DocumentController { return &DocumentController{ - document: svc, + validator: validator, + document: svc, } } @@ -31,7 +35,10 @@ func (s *DocumentController) Sync(ctx context.Context, config *queue.QueueConfig return err } - // TODO normalise input here + err = s.validator.Struct(body) + if err != nil { + return err + } err = s.document.Sync(ctx, &body) if err != nil { diff --git a/cmd/grpc/main.go b/cmd/grpc/main.go index 9308e77a..a4bed5c2 100644 --- a/cmd/grpc/main.go +++ b/cmd/grpc/main.go @@ -14,6 +14,7 @@ import ( "net" "strconv" + "github.com/go-playground/validator/v10" _ "github.com/lib/pq" "google.golang.org/grpc" ) @@ -37,11 +38,12 @@ func main() { pool := database.GetDBPool(ctx) db := repository.New(pool) + valid := validator.New() grpcServer := grpc.NewServer() - spec.RegisterQueryServiceServer(grpcServer, controllers.NewQueryController(*query.New(db))) - spec.RegisterExportServiceServer(grpcServer, controllers.NewExportController(*export.New(db))) - spec.RegisterJobCollectorServiceServer(grpcServer, controllers.NewJobCollectorController(*collector.New(db))) + spec.RegisterQueryServiceServer(grpcServer, controllers.NewQueryController(*query.New(db), valid)) + spec.RegisterExportServiceServer(grpcServer, controllers.NewExportController(*export.New(db), valid)) + spec.RegisterJobCollectorServiceServer(grpcServer, controllers.NewJobCollectorController(*collector.New(db), valid)) log.Printf("Listening on port %d", port) if err := grpcServer.Serve(lis); err != nil { diff --git a/cmd/queue/main.go b/cmd/queue/main.go index 5c5c566f..63d50ae9 100644 --- a/cmd/queue/main.go +++ b/cmd/queue/main.go @@ -13,6 +13,7 @@ import ( "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sqs" + "github.com/go-playground/validator/v10" ) func main() { @@ -34,9 +35,10 @@ func main() { conn := database.GetDBConn(ctx) db := repository.New(conn) + valid := validator.New() controllers := queue.Controllers{ - Document: *queue.NewDocumentController(*document.New(db)), + Document: *queue.NewDocumentController(*document.New(db), valid), } config := queue.Queue{ diff --git a/go.mod b/go.mod index a0192fc3..067efb69 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.32.5 github.com/aws/aws-sdk-go-v2/config v1.28.5 github.com/aws/aws-sdk-go-v2/service/sqs v1.37.1 + github.com/go-playground/validator/v10 v10.23.0 github.com/golang-migrate/migrate/v4 v4.18.1 github.com/golang/protobuf v1.5.4 github.com/jackc/pgx/v5 v5.5.5 @@ -21,12 +22,16 @@ require ( require ( github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/tidwall/match v1.1.1 // indirect diff --git a/go.sum b/go.sum index dd7ce640..c5c908a6 100644 --- a/go.sum +++ b/go.sum @@ -59,6 +59,8 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +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/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -67,6 +69,14 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre 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-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +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.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= +github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-migrate/migrate/v4 v4.18.1 h1:JML/k+t4tpHCpQTCAD62Nu43NUFzHY4CV3uAuvHGC+Y= @@ -102,6 +112,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= diff --git a/internal/document/service.go b/internal/document/service.go index 3a84db9e..a30e6188 100644 --- a/internal/document/service.go +++ b/internal/document/service.go @@ -11,11 +11,11 @@ import ( ) type Document struct { - ID uuid.UUID `json:"id"` - JobID uuid.UUID `json:"jobId"` - Name string `json:"name"` - CleanVersion int32 `json:"cleanVersion"` - TextVersion int32 `json:"textVersion"` + ID uuid.UUID `json:"id" validate:"required,uuid"` + JobID uuid.UUID `json:"jobId" validate:"required,uuid"` + Name string `json:"name" validate:"required"` + CleanVersion int32 `json:"cleanVersion" validate:"required,gt=0"` + TextVersion int32 `json:"textVersion" validate:"required,gt=0"` } type Service struct { diff --git a/test/integration/grpc/container_test.go b/test/integration/grpc/container_test.go index f11f5b40..675cdeb4 100644 --- a/test/integration/grpc/container_test.go +++ b/test/integration/grpc/container_test.go @@ -26,12 +26,6 @@ func createContainer(t *testing.T, ctx context.Context, config *containerConfig) } req := testcontainers.ContainerRequest{ - //TODO - //FromDockerfile: testcontainers.FromDockerfile{ - // Context: "../../..", - // Dockerfile: "build/package/grpc/Dockerfile", - // KeepImage: true, - //}, Image: "gotemplate_grpc:latest", Env: map[string]string{ "DB_USER": config.DB.User, diff --git a/test/integration/grpc/query_test.go b/test/integration/grpc/query_test.go index f6efecb9..96c30b26 100644 --- a/test/integration/grpc/query_test.go +++ b/test/integration/grpc/query_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestName(t *testing.T) { +func TestQuery(t *testing.T) { ctx := context.Background() conn, cleanup := createDependencies(t, ctx) diff --git a/test/integration/queue/container_test.go b/test/integration/queue/container_test.go index 3ee3918c..a175f2cc 100644 --- a/test/integration/queue/container_test.go +++ b/test/integration/queue/container_test.go @@ -32,12 +32,6 @@ func createContainer(t *testing.T, ctx context.Context, config containerConfig) } req := testcontainers.ContainerRequest{ - //TODO - //FromDockerfile: testcontainers.FromDockerfile{ - // Context: "../../..", - // Dockerfile: "build/package/queue/Dockerfile", - // KeepImage: true, - //}, Image: "gotemplate_queue:latest", Env: map[string]string{ "QUEUE_URL": config.Queue.URL, diff --git a/test/integration/queue/querysync_test.go b/test/integration/queue/querysync_test.go index 93c9a649..6e683378 100644 --- a/test/integration/queue/querysync_test.go +++ b/test/integration/queue/querysync_test.go @@ -32,5 +32,5 @@ func TestName(t *testing.T) { Body: string(docJson), }) - assertMessageWait(t, ctx, queue, "DOCQUERY") + assertMessageWait(t, ctx, queue, "DOCTEXT") // Fails so send it back to the queue } diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go b/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go index bf71684f..5599082a 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package winterm diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/api.go b/vendor/github.com/Azure/go-ansiterm/winterm/api.go index 2f297601..6055e33b 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/api.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/api.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package winterm diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go b/vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go index 644d8b2b..cbec8f72 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package winterm diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go b/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go index 6b4b8a1e..3ee06ea7 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package winterm diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go b/vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go index 1298544a..244b5fa2 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package winterm diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go b/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go index 03ab280c..2d27fa1d 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package winterm diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/utilities.go b/vendor/github.com/Azure/go-ansiterm/winterm/utilities.go index 3535349f..afa7635d 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/utilities.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/utilities.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package winterm diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go b/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go index 1e19ea0c..2d40fb75 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package winterm diff --git a/vendor/github.com/aws/smithy-go/document/document.go b/vendor/github.com/aws/smithy-go/document/document.go index 63a9add3..8f852d95 100644 --- a/vendor/github.com/aws/smithy-go/document/document.go +++ b/vendor/github.com/aws/smithy-go/document/document.go @@ -15,26 +15,26 @@ import ( // When defining struct types. the `document` struct tag can be used to control how the value will be // marshaled into the resulting protocol document. // -// // Field is ignored -// Field int `document:"-"` +// // Field is ignored +// Field int `document:"-"` // -// // Field object of key "myName" -// Field int `document:"myName"` +// // Field object of key "myName" +// Field int `document:"myName"` // -// // Field object key of key "myName", and -// // Field is omitted if the field is a zero value for the type. -// Field int `document:"myName,omitempty"` +// // Field object key of key "myName", and +// // Field is omitted if the field is a zero value for the type. +// Field int `document:"myName,omitempty"` // -// // Field object key of "Field", and -// // Field is omitted if the field is a zero value for the type. -// Field int `document:",omitempty"` +// // Field object key of "Field", and +// // Field is omitted if the field is a zero value for the type. +// Field int `document:",omitempty"` // // All struct fields, including anonymous fields, are marshaled unless the // any of the following conditions are meet. // -// - the field is not exported -// - document field tag is "-" -// - document field tag specifies "omitempty", and is a zero value. +// - the field is not exported +// - document field tag is "-" +// - document field tag specifies "omitempty", and is a zero value. // // Pointer and interface values are encoded as the value pointed to or // contained in the interface. A nil value encodes as a null @@ -63,13 +63,12 @@ type Marshaler interface { // // Both generic interface{} and concrete types are valid unmarshal destination types. When unmarshaling a document // into an empty interface the Unmarshaler will store one of these values: -// -// bool, for boolean values -// document.Number, for arbitrary-precision numbers (int64, float64, big.Int, big.Float) -// string, for string values -// []interface{}, for array values -// map[string]interface{}, for objects -// nil, for null values +// bool, for boolean values +// document.Number, for arbitrary-precision numbers (int64, float64, big.Int, big.Float) +// string, for string values +// []interface{}, for array values +// map[string]interface{}, for objects +// nil, for null values // // When unmarshaling, any error that occurs will halt the unmarshal and return the error. type Unmarshaler interface { diff --git a/vendor/github.com/aws/smithy-go/encoding/xml/doc.go b/vendor/github.com/aws/smithy-go/encoding/xml/doc.go index 7e671a75..f9200093 100644 --- a/vendor/github.com/aws/smithy-go/encoding/xml/doc.go +++ b/vendor/github.com/aws/smithy-go/encoding/xml/doc.go @@ -4,21 +4,21 @@ shape serializer function in which a xml.Value will be passed around. Resources followed: https://smithy.io/2.0/spec/protocol-traits.html#xml-bindings -# Member Element +Member Element Member element should be used to encode xml shapes into xml elements except for flattened xml shapes. Member element write their own element start tag. These elements should always be closed. -# Flattened Element +Flattened Element Flattened element should be used to encode shapes marked with flattened trait into xml elements. Flattened element do not write a start tag, and thus should not be closed. -# Simple types encoding +Simple types encoding All simple type methods on value such as String(), Long() etc; auto close the associated member element. -# Array +Array Array returns the collection encoder. It has two modes, wrapped and flattened encoding. @@ -32,7 +32,7 @@ If a shape is marked as flattened, Array() will use the shape element name as wr appletree -# Map +Map Map is the map encoder. It has two modes, wrapped and flattened encoding. diff --git a/vendor/github.com/aws/smithy-go/middleware/doc.go b/vendor/github.com/aws/smithy-go/middleware/doc.go index c6f63557..9858928a 100644 --- a/vendor/github.com/aws/smithy-go/middleware/doc.go +++ b/vendor/github.com/aws/smithy-go/middleware/doc.go @@ -14,7 +14,7 @@ // handler. A handler could be something like an HTTP Client that round trips an // API operation over HTTP. // -// # Smithy Middleware Stack +// Smithy Middleware Stack // // A Stack is a collection of middleware that wrap a handler. The stack can be // broken down into discreet steps. Each step may contain zero or more middleware @@ -48,20 +48,20 @@ // the request message. Deserializes the response into a structured type or // error above stacks can react to. // -// # Adding Middleware to a Stack Step +// Adding Middleware to a Stack Step // // Middleware can be added to a step front or back, or relative, by name, to an // existing middleware in that stack. If a middleware does not have a name, a // unique name will be generated at the middleware and be added to the step. // -// // Create middleware stack -// stack := middleware.NewStack() +// // Create middleware stack +// stack := middleware.NewStack() // -// // Add middleware to stack steps -// stack.Initialize.Add(paramValidationMiddleware, middleware.After) -// stack.Serialize.Add(marshalOperationFoo, middleware.After) -// stack.Deserialize.Add(unmarshalOperationFoo, middleware.After) +// // Add middleware to stack steps +// stack.Initialize.Add(paramValidationMiddleware, middleware.After) +// stack.Serialize.Add(marshalOperationFoo, middleware.After) +// stack.Deserialize.Add(unmarshalOperationFoo, middleware.After) // -// // Invoke middleware on handler. -// resp, err := stack.HandleMiddleware(ctx, req.Input, clientHandler) +// // Invoke middleware on handler. +// resp, err := stack.HandleMiddleware(ctx, req.Input, clientHandler) package middleware diff --git a/vendor/github.com/aws/smithy-go/middleware/stack.go b/vendor/github.com/aws/smithy-go/middleware/stack.go index 3447bcf7..45ccb5b9 100644 --- a/vendor/github.com/aws/smithy-go/middleware/stack.go +++ b/vendor/github.com/aws/smithy-go/middleware/stack.go @@ -13,7 +13,7 @@ import ( // Steps are composed as middleware around the underlying handler in the // following order: // -// Initialize -> Serialize -> Build -> Finalize -> Deserialize -> Handler +// Initialize -> Serialize -> Build -> Finalize -> Deserialize -> Handler // // Any middleware within the chain may choose to stop and return an error or // response. Since the middleware decorate the handler like a call stack, each @@ -21,7 +21,7 @@ import ( // Middleware that does not need to react to an input, or result must forward // along the input down the chain, or return the result back up the chain. // -// Initialize <- Serialize -> Build -> Finalize <- Deserialize <- Handler +// Initialize <- Serialize -> Build -> Finalize <- Deserialize <- Handler type Stack struct { // Initialize prepares the input, and sets any default parameters as // needed, (e.g. idempotency token, and presigned URLs). diff --git a/vendor/github.com/cenkalti/backoff/v4/exponential.go b/vendor/github.com/cenkalti/backoff/v4/exponential.go index c022296a..aac99f19 100644 --- a/vendor/github.com/cenkalti/backoff/v4/exponential.go +++ b/vendor/github.com/cenkalti/backoff/v4/exponential.go @@ -11,17 +11,17 @@ period for each retry attempt using a randomization function that grows exponent NextBackOff() is calculated using the following formula: - randomized interval = - RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor]) + randomized interval = + RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor]) In other words NextBackOff() will range between the randomization factor percentage below and above the retry interval. For example, given the following parameters: - RetryInterval = 2 - RandomizationFactor = 0.5 - Multiplier = 2 + RetryInterval = 2 + RandomizationFactor = 0.5 + Multiplier = 2 the actual backoff period used in the next retry attempt will range between 1 and 3 seconds, multiplied by the exponential, that is, between 2 and 6 seconds. @@ -36,18 +36,18 @@ The elapsed time can be reset by calling Reset(). Example: Given the following default arguments, for 10 tries the sequence will be, and assuming we go over the MaxElapsedTime on the 10th try: - Request # RetryInterval (seconds) Randomized Interval (seconds) + Request # RetryInterval (seconds) Randomized Interval (seconds) - 1 0.5 [0.25, 0.75] - 2 0.75 [0.375, 1.125] - 3 1.125 [0.562, 1.687] - 4 1.687 [0.8435, 2.53] - 5 2.53 [1.265, 3.795] - 6 3.795 [1.897, 5.692] - 7 5.692 [2.846, 8.538] - 8 8.538 [4.269, 12.807] - 9 12.807 [6.403, 19.210] - 10 19.210 backoff.Stop + 1 0.5 [0.25, 0.75] + 2 0.75 [0.375, 1.125] + 3 1.125 [0.562, 1.687] + 4 1.687 [0.8435, 2.53] + 5 2.53 [1.265, 3.795] + 6 3.795 [1.897, 5.692] + 7 5.692 [2.846, 8.538] + 8 8.538 [4.269, 12.807] + 9 12.807 [6.403, 19.210] + 10 19.210 backoff.Stop Note: Implementation is not thread-safe. */ @@ -167,8 +167,7 @@ func (b *ExponentialBackOff) Reset() { } // NextBackOff calculates the next backoff interval using the formula: -// -// Randomized interval = RetryInterval * (1 ± RandomizationFactor) +// Randomized interval = RetryInterval * (1 ± RandomizationFactor) func (b *ExponentialBackOff) NextBackOff() time.Duration { // Make sure we have not gone over the maximum elapsed time. elapsed := b.GetElapsedTime() @@ -201,8 +200,7 @@ func (b *ExponentialBackOff) incrementCurrentInterval() { } // Returns a random value from the following interval: -// -// [currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval]. +// [currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval]. func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration { if randomizationFactor == 0 { return currentInterval // make sure no randomness is used when randomizationFactor is 0. diff --git a/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/davecgh/go-spew/spew/bypass.go index 70ddeaad..79299478 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypass.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -18,7 +18,6 @@ // tag is deprecated and thus should not be used. // Go versions prior to 1.4 are disabled because they use a different layout // for interfaces which make the implementation of unsafeReflectValue more complex. -//go:build !js && !appengine && !safe && !disableunsafe && go1.4 // +build !js,!appengine,!safe,!disableunsafe,go1.4 package spew diff --git a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go index 5e2d890d..205c28d6 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -16,7 +16,6 @@ // when the code is running on Google App Engine, compiled by GopherJS, or // "-tags safe" is added to the go build command line. The "disableunsafe" // tag is deprecated and thus should not be used. -//go:build js || appengine || safe || disableunsafe || !go1.4 // +build js appengine safe disableunsafe !go1.4 package spew diff --git a/vendor/github.com/davecgh/go-spew/spew/config.go b/vendor/github.com/davecgh/go-spew/spew/config.go index 161895fc..2e3d22f3 100644 --- a/vendor/github.com/davecgh/go-spew/spew/config.go +++ b/vendor/github.com/davecgh/go-spew/spew/config.go @@ -254,15 +254,15 @@ pointer addresses used to indirect to the final value. It provides the following features over the built-in printing facilities provided by the fmt package: - - Pointers are dereferenced and followed - - Circular data structures are detected and handled properly - - Custom Stringer/error interfaces are optionally invoked, including - on unexported types - - Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - - Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output The configuration options are controlled by modifying the public members of c. See ConfigState for options documentation. @@ -295,12 +295,12 @@ func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) // NewDefaultConfig returns a ConfigState with the following default settings. // -// Indent: " " -// MaxDepth: 0 -// DisableMethods: false -// DisablePointerMethods: false -// ContinueOnMethod: false -// SortKeys: false +// Indent: " " +// MaxDepth: 0 +// DisableMethods: false +// DisablePointerMethods: false +// ContinueOnMethod: false +// SortKeys: false func NewDefaultConfig() *ConfigState { return &ConfigState{Indent: " "} } diff --git a/vendor/github.com/davecgh/go-spew/spew/doc.go b/vendor/github.com/davecgh/go-spew/spew/doc.go index 722e9aa7..aacaac6f 100644 --- a/vendor/github.com/davecgh/go-spew/spew/doc.go +++ b/vendor/github.com/davecgh/go-spew/spew/doc.go @@ -21,36 +21,35 @@ debugging. A quick overview of the additional features spew provides over the built-in printing facilities for Go data types are as follows: - - Pointers are dereferenced and followed - - Circular data structures are detected and handled properly - - Custom Stringer/error interfaces are optionally invoked, including - on unexported types - - Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - - Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output (only when using - Dump style) + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output (only when using + Dump style) There are two different approaches spew allows for dumping Go data structures: - - Dump style which prints with newlines, customizable indentation, - and additional debug information such as types and all pointer addresses - used to indirect to the final value - - A custom Formatter interface that integrates cleanly with the standard fmt - package and replaces %v, %+v, %#v, and %#+v to provide inline printing - similar to the default %v while providing the additional functionality - outlined above and passing unsupported format verbs such as %x and %q - along to fmt + * Dump style which prints with newlines, customizable indentation, + and additional debug information such as types and all pointer addresses + used to indirect to the final value + * A custom Formatter interface that integrates cleanly with the standard fmt + package and replaces %v, %+v, %#v, and %#+v to provide inline printing + similar to the default %v while providing the additional functionality + outlined above and passing unsupported format verbs such as %x and %q + along to fmt -# Quick Start +Quick Start This section demonstrates how to quickly get started with spew. See the sections below for further details on formatting and configuration options. To dump a variable with full newlines, indentation, type, and pointer information use Dump, Fdump, or Sdump: - spew.Dump(myVar1, myVar2, ...) spew.Fdump(someWriter, myVar1, myVar2, ...) str := spew.Sdump(myVar1, myVar2, ...) @@ -59,13 +58,12 @@ Alternatively, if you would prefer to use format strings with a compacted inline printing style, use the convenience wrappers Printf, Fprintf, etc with %v (most compact), %+v (adds pointer addresses), %#v (adds types), or %#+v (adds types and pointer addresses): - spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) -# Configuration Options +Configuration Options Configuration of spew is handled by fields in the ConfigState type. For convenience, all of the top-level functions use a global state available @@ -76,52 +74,51 @@ equivalent to the top-level functions. This allows concurrent configuration options. See the ConfigState documentation for more details. The following configuration options are available: + * Indent + String to use for each indentation level for Dump functions. + It is a single space by default. A popular alternative is "\t". - - Indent - String to use for each indentation level for Dump functions. - It is a single space by default. A popular alternative is "\t". + * MaxDepth + Maximum number of levels to descend into nested data structures. + There is no limit by default. - - MaxDepth - Maximum number of levels to descend into nested data structures. - There is no limit by default. + * DisableMethods + Disables invocation of error and Stringer interface methods. + Method invocation is enabled by default. - - DisableMethods - Disables invocation of error and Stringer interface methods. - Method invocation is enabled by default. + * DisablePointerMethods + Disables invocation of error and Stringer interface methods on types + which only accept pointer receivers from non-pointer variables. + Pointer method invocation is enabled by default. - - DisablePointerMethods - Disables invocation of error and Stringer interface methods on types - which only accept pointer receivers from non-pointer variables. - Pointer method invocation is enabled by default. + * DisablePointerAddresses + DisablePointerAddresses specifies whether to disable the printing of + pointer addresses. This is useful when diffing data structures in tests. - - DisablePointerAddresses - DisablePointerAddresses specifies whether to disable the printing of - pointer addresses. This is useful when diffing data structures in tests. + * DisableCapacities + DisableCapacities specifies whether to disable the printing of + capacities for arrays, slices, maps and channels. This is useful when + diffing data structures in tests. - - DisableCapacities - DisableCapacities specifies whether to disable the printing of - capacities for arrays, slices, maps and channels. This is useful when - diffing data structures in tests. + * ContinueOnMethod + Enables recursion into types after invoking error and Stringer interface + methods. Recursion after method invocation is disabled by default. - - ContinueOnMethod - Enables recursion into types after invoking error and Stringer interface - methods. Recursion after method invocation is disabled by default. + * SortKeys + Specifies map keys should be sorted before being printed. Use + this to have a more deterministic, diffable output. Note that + only native types (bool, int, uint, floats, uintptr and string) + and types which implement error or Stringer interfaces are + supported with other types sorted according to the + reflect.Value.String() output which guarantees display + stability. Natural map order is used by default. - - SortKeys - Specifies map keys should be sorted before being printed. Use - this to have a more deterministic, diffable output. Note that - only native types (bool, int, uint, floats, uintptr and string) - and types which implement error or Stringer interfaces are - supported with other types sorted according to the - reflect.Value.String() output which guarantees display - stability. Natural map order is used by default. + * SpewKeys + Specifies that, as a last resort attempt, map keys should be + spewed to strings and sorted by those strings. This is only + considered if SortKeys is true. - - SpewKeys - Specifies that, as a last resort attempt, map keys should be - spewed to strings and sorted by those strings. This is only - considered if SortKeys is true. - -# Dump Usage +Dump Usage Simply call spew.Dump with a list of variables you want to dump: @@ -136,7 +133,7 @@ A third option is to call spew.Sdump to get the formatted output as a string: str := spew.Sdump(myVar1, myVar2, ...) -# Sample Dump Output +Sample Dump Output See the Dump example for details on the setup of the types and variables being shown here. @@ -153,14 +150,13 @@ shown here. Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C command as shown. - ([]uint8) (len=32 cap=32) { 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| 00000020 31 32 |12| } -# Custom Formatter +Custom Formatter Spew provides a custom formatter that implements the fmt.Formatter interface so that it integrates cleanly with standard fmt package printing functions. The @@ -174,7 +170,7 @@ standard fmt package for formatting. In addition, the custom formatter ignores the width and precision arguments (however they will still work on the format specifiers not handled by the custom formatter). -# Custom Formatter Usage +Custom Formatter Usage The simplest way to make use of the spew custom formatter is to call one of the convenience functions such as spew.Printf, spew.Println, or spew.Printf. The @@ -188,17 +184,15 @@ functions have syntax you are most likely already familiar with: See the Index for the full list convenience functions. -# Sample Formatter Output +Sample Formatter Output Double pointer to a uint8: - %v: <**>5 %+v: <**>(0xf8400420d0->0xf8400420c8)5 %#v: (**uint8)5 %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 Pointer to circular struct with a uint8 field and a pointer to itself: - %v: <*>{1 <*>} %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} @@ -207,7 +201,7 @@ Pointer to circular struct with a uint8 field and a pointer to itself: See the Printf example for details on the setup of variables being shown here. -# Errors +Errors Since it is possible for custom Stringer/error interfaces to panic, spew detects them and handles them internally by printing the panic information diff --git a/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/davecgh/go-spew/spew/dump.go index 8323041a..f78d89fc 100644 --- a/vendor/github.com/davecgh/go-spew/spew/dump.go +++ b/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -488,15 +488,15 @@ pointer addresses used to indirect to the final value. It provides the following features over the built-in printing facilities provided by the fmt package: - - Pointers are dereferenced and followed - - Circular data structures are detected and handled properly - - Custom Stringer/error interfaces are optionally invoked, including - on unexported types - - Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - - Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output The configuration options are controlled by an exported package global, spew.Config. See ConfigState for options documentation. diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go b/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go index cffd3d05..101cedde 100644 --- a/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go +++ b/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go @@ -1,6 +1,4 @@ -//go:build go1.8 // +build go1.8 - // Code generated by "httpsnoop/codegen"; DO NOT EDIT. package httpsnoop diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go b/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go index c5ae1966..e0951df1 100644 --- a/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go +++ b/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go @@ -1,6 +1,4 @@ -//go:build !go1.8 // +build !go1.8 - // Code generated by "httpsnoop/codegen"; DO NOT EDIT. package httpsnoop diff --git a/vendor/github.com/gabriel-vasile/mimetype/.gitattributes b/vendor/github.com/gabriel-vasile/mimetype/.gitattributes new file mode 100644 index 00000000..0cc26ec0 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/.gitattributes @@ -0,0 +1 @@ +testdata/* linguist-vendored diff --git a/vendor/github.com/gabriel-vasile/mimetype/CODE_OF_CONDUCT.md b/vendor/github.com/gabriel-vasile/mimetype/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..8479cd87 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at vasile.gabriel@email.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/vendor/github.com/gabriel-vasile/mimetype/CONTRIBUTING.md b/vendor/github.com/gabriel-vasile/mimetype/CONTRIBUTING.md new file mode 100644 index 00000000..56ae4e57 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/CONTRIBUTING.md @@ -0,0 +1,12 @@ +## Contribute +Contributions to **mimetype** are welcome. If you find an issue and you consider +contributing, you can use the [Github issues tracker](https://github.com/gabriel-vasile/mimetype/issues) +in order to report it, or better yet, open a pull request. + +Code contributions must respect these rules: + - code must be test covered + - code must be formatted using gofmt tool + - exported names must be documented + +**Important**: By submitting a pull request, you agree to allow the project +owner to license your work under the same license as that used by the project. diff --git a/vendor/github.com/gabriel-vasile/mimetype/LICENSE b/vendor/github.com/gabriel-vasile/mimetype/LICENSE new file mode 100644 index 00000000..6aac070c --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018-2020 Gabriel Vasile + +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/gabriel-vasile/mimetype/README.md b/vendor/github.com/gabriel-vasile/mimetype/README.md new file mode 100644 index 00000000..231b2919 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/README.md @@ -0,0 +1,105 @@ +

+ mimetype +

+ +

+ A package for detecting MIME types and extensions based on magic numbers +

+
+ Goroutine safe, extensible, no C bindings +
+ +

+ + Go Reference + + + Go report card + + + Code coverage + + + License + +

+ +## Features +- fast and precise MIME type and file extension detection +- long list of [supported MIME types](supported_mimes.md) +- possibility to [extend](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#example-package-Extend) with other file formats +- common file formats are prioritized +- [text vs. binary files differentiation](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#example-package-TextVsBinary) +- safe for concurrent usage + +## Install +```bash +go get github.com/gabriel-vasile/mimetype +``` + +## Usage +```go +mtype := mimetype.Detect([]byte) +// OR +mtype, err := mimetype.DetectReader(io.Reader) +// OR +mtype, err := mimetype.DetectFile("/path/to/file") +fmt.Println(mtype.String(), mtype.Extension()) +``` +See the [runnable Go Playground examples](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#pkg-overview). + +## Usage' +Only use libraries like **mimetype** as a last resort. Content type detection +using magic numbers is slow, inaccurate, and non-standard. Most of the times +protocols have methods for specifying such metadata; e.g., `Content-Type` header +in HTTP and SMTP. + +## FAQ +Q: My file is in the list of [supported MIME types](supported_mimes.md) but +it is not correctly detected. What should I do? + +A: Some file formats (often Microsoft Office documents) keep their signatures +towards the end of the file. Try increasing the number of bytes used for detection +with: +```go +mimetype.SetLimit(1024*1024) // Set limit to 1MB. +// or +mimetype.SetLimit(0) // No limit, whole file content used. +mimetype.DetectFile("file.doc") +``` +If increasing the limit does not help, please +[open an issue](https://github.com/gabriel-vasile/mimetype/issues/new?assignees=&labels=&template=mismatched-mime-type-detected.md&title=). + +## Structure +**mimetype** uses a hierarchical structure to keep the MIME type detection logic. +This reduces the number of calls needed for detecting the file type. The reason +behind this choice is that there are file formats used as containers for other +file formats. For example, Microsoft Office files are just zip archives, +containing specific metadata files. Once a file has been identified as a +zip, there is no need to check if it is a text file, but it is worth checking if +it is an Microsoft Office file. + +To prevent loading entire files into memory, when detecting from a +[reader](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#DetectReader) +or from a [file](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#DetectFile) +**mimetype** limits itself to reading only the header of the input. +
+ structure +
+ +## Performance +Thanks to the hierarchical structure, searching for common formats first, +and limiting itself to file headers, **mimetype** matches the performance of +stdlib `http.DetectContentType` while outperforming the alternative package. + +```bash + mimetype http.DetectContentType filetype +BenchmarkMatchTar-24 250 ns/op 400 ns/op 3778 ns/op +BenchmarkMatchZip-24 524 ns/op 351 ns/op 4884 ns/op +BenchmarkMatchJpeg-24 103 ns/op 228 ns/op 839 ns/op +BenchmarkMatchGif-24 139 ns/op 202 ns/op 751 ns/op +BenchmarkMatchPng-24 165 ns/op 221 ns/op 1176 ns/op +``` + +## Contributing +See [CONTRIBUTING.md](CONTRIBUTING.md). diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/charset/charset.go b/vendor/github.com/gabriel-vasile/mimetype/internal/charset/charset.go new file mode 100644 index 00000000..0647f730 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/charset/charset.go @@ -0,0 +1,309 @@ +package charset + +import ( + "bytes" + "encoding/xml" + "strings" + "unicode/utf8" + + "golang.org/x/net/html" +) + +const ( + F = 0 /* character never appears in text */ + T = 1 /* character appears in plain ASCII text */ + I = 2 /* character appears in ISO-8859 text */ + X = 3 /* character appears in non-ISO extended ASCII (Mac, IBM PC) */ +) + +var ( + boms = []struct { + bom []byte + enc string + }{ + {[]byte{0xEF, 0xBB, 0xBF}, "utf-8"}, + {[]byte{0x00, 0x00, 0xFE, 0xFF}, "utf-32be"}, + {[]byte{0xFF, 0xFE, 0x00, 0x00}, "utf-32le"}, + {[]byte{0xFE, 0xFF}, "utf-16be"}, + {[]byte{0xFF, 0xFE}, "utf-16le"}, + } + + // https://github.com/file/file/blob/fa93fb9f7d21935f1c7644c47d2975d31f12b812/src/encoding.c#L241 + textChars = [256]byte{ + /* BEL BS HT LF VT FF CR */ + F, F, F, F, F, F, F, T, T, T, T, T, T, T, F, F, /* 0x0X */ + /* ESC */ + F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, F, /* 0x1X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x2X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x3X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x4X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x5X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x6X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, /* 0x7X */ + /* NEL */ + X, X, X, X, X, T, X, X, X, X, X, X, X, X, X, X, /* 0x8X */ + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, /* 0x9X */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xaX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xbX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xcX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xdX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xeX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xfX */ + } +) + +// FromBOM returns the charset declared in the BOM of content. +func FromBOM(content []byte) string { + for _, b := range boms { + if bytes.HasPrefix(content, b.bom) { + return b.enc + } + } + return "" +} + +// FromPlain returns the charset of a plain text. It relies on BOM presence +// and it falls back on checking each byte in content. +func FromPlain(content []byte) string { + if len(content) == 0 { + return "" + } + if cset := FromBOM(content); cset != "" { + return cset + } + origContent := content + // Try to detect UTF-8. + // First eliminate any partial rune at the end. + for i := len(content) - 1; i >= 0 && i > len(content)-4; i-- { + b := content[i] + if b < 0x80 { + break + } + if utf8.RuneStart(b) { + content = content[:i] + break + } + } + hasHighBit := false + for _, c := range content { + if c >= 0x80 { + hasHighBit = true + break + } + } + if hasHighBit && utf8.Valid(content) { + return "utf-8" + } + + // ASCII is a subset of UTF8. Follow W3C recommendation and replace with UTF8. + if ascii(origContent) { + return "utf-8" + } + + return latin(origContent) +} + +func latin(content []byte) string { + hasControlBytes := false + for _, b := range content { + t := textChars[b] + if t != T && t != I { + return "" + } + if b >= 0x80 && b <= 0x9F { + hasControlBytes = true + } + } + // Code range 0x80 to 0x9F is reserved for control characters in ISO-8859-1 + // (so-called C1 Controls). Windows 1252, however, has printable punctuation + // characters in this range. + if hasControlBytes { + return "windows-1252" + } + return "iso-8859-1" +} + +func ascii(content []byte) bool { + for _, b := range content { + if textChars[b] != T { + return false + } + } + return true +} + +// FromXML returns the charset of an XML document. It relies on the XML +// header and falls back on the plain +// text content. +func FromXML(content []byte) string { + if cset := fromXML(content); cset != "" { + return cset + } + return FromPlain(content) +} +func fromXML(content []byte) string { + content = trimLWS(content) + dec := xml.NewDecoder(bytes.NewReader(content)) + rawT, err := dec.RawToken() + if err != nil { + return "" + } + + t, ok := rawT.(xml.ProcInst) + if !ok { + return "" + } + + return strings.ToLower(xmlEncoding(string(t.Inst))) +} + +// FromHTML returns the charset of an HTML document. It first looks if a BOM is +// present and if so uses it to determine the charset. If no BOM is present, +// it relies on the meta tag and falls back on the +// plain text content. +func FromHTML(content []byte) string { + if cset := FromBOM(content); cset != "" { + return cset + } + if cset := fromHTML(content); cset != "" { + return cset + } + return FromPlain(content) +} + +func fromHTML(content []byte) string { + z := html.NewTokenizer(bytes.NewReader(content)) + for { + switch z.Next() { + case html.ErrorToken: + return "" + + case html.StartTagToken, html.SelfClosingTagToken: + tagName, hasAttr := z.TagName() + if !bytes.Equal(tagName, []byte("meta")) { + continue + } + attrList := make(map[string]bool) + gotPragma := false + + const ( + dontKnow = iota + doNeedPragma + doNotNeedPragma + ) + needPragma := dontKnow + + name := "" + for hasAttr { + var key, val []byte + key, val, hasAttr = z.TagAttr() + ks := string(key) + if attrList[ks] { + continue + } + attrList[ks] = true + for i, c := range val { + if 'A' <= c && c <= 'Z' { + val[i] = c + 0x20 + } + } + + switch ks { + case "http-equiv": + if bytes.Equal(val, []byte("content-type")) { + gotPragma = true + } + + case "content": + name = fromMetaElement(string(val)) + if name != "" { + needPragma = doNeedPragma + } + + case "charset": + name = string(val) + needPragma = doNotNeedPragma + } + } + + if needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma { + continue + } + + if strings.HasPrefix(name, "utf-16") { + name = "utf-8" + } + + return name + } + } +} + +func fromMetaElement(s string) string { + for s != "" { + csLoc := strings.Index(s, "charset") + if csLoc == -1 { + return "" + } + s = s[csLoc+len("charset"):] + s = strings.TrimLeft(s, " \t\n\f\r") + if !strings.HasPrefix(s, "=") { + continue + } + s = s[1:] + s = strings.TrimLeft(s, " \t\n\f\r") + if s == "" { + return "" + } + if q := s[0]; q == '"' || q == '\'' { + s = s[1:] + closeQuote := strings.IndexRune(s, rune(q)) + if closeQuote == -1 { + return "" + } + return s[:closeQuote] + } + + end := strings.IndexAny(s, "; \t\n\f\r") + if end == -1 { + end = len(s) + } + return s[:end] + } + return "" +} + +func xmlEncoding(s string) string { + param := "encoding=" + idx := strings.Index(s, param) + if idx == -1 { + return "" + } + v := s[idx+len(param):] + if v == "" { + return "" + } + if v[0] != '\'' && v[0] != '"' { + return "" + } + idx = strings.IndexRune(v[1:], rune(v[0])) + if idx == -1 { + return "" + } + return v[1 : idx+1] +} + +// trimLWS trims whitespace from beginning of the input. +// TODO: find a way to call trimLWS once per detection instead of once in each +// detector which needs the trimmed input. +func trimLWS(in []byte) []byte { + firstNonWS := 0 + for ; firstNonWS < len(in) && isWS(in[firstNonWS]); firstNonWS++ { + } + + return in[firstNonWS:] +} + +func isWS(b byte) bool { + return b == '\t' || b == '\n' || b == '\x0c' || b == '\r' || b == ' ' +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/json/json.go b/vendor/github.com/gabriel-vasile/mimetype/internal/json/json.go new file mode 100644 index 00000000..ee39349a --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/json/json.go @@ -0,0 +1,544 @@ +// Copyright (c) 2009 The Go Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Package json provides a JSON value parser state machine. +// This package is almost entirely copied from the Go stdlib. +// Changes made to it permit users of the package to tell +// if some slice of bytes is a valid beginning of a json string. +package json + +import ( + "fmt" +) + +type ( + scanStatus int +) + +const ( + parseObjectKey = iota // parsing object key (before colon) + parseObjectValue // parsing object value (after colon) + parseArrayValue // parsing array value + + scanContinue scanStatus = iota // uninteresting byte + scanBeginLiteral // end implied by next result != scanContinue + scanBeginObject // begin object + scanObjectKey // just finished object key (string) + scanObjectValue // just finished non-last object value + scanEndObject // end object (implies scanObjectValue if possible) + scanBeginArray // begin array + scanArrayValue // just finished array value + scanEndArray // end array (implies scanArrayValue if possible) + scanSkipSpace // space byte; can skip; known to be last "continue" result + scanEnd // top-level value ended *before* this byte; known to be first "stop" result + scanError // hit an error, scanner.err. + + // This limits the max nesting depth to prevent stack overflow. + // This is permitted by https://tools.ietf.org/html/rfc7159#section-9 + maxNestingDepth = 10000 +) + +type ( + scanner struct { + step func(*scanner, byte) scanStatus + parseState []int + endTop bool + err error + index int + } +) + +// Scan returns the number of bytes scanned and if there was any error +// in trying to reach the end of data. +func Scan(data []byte) (int, error) { + s := &scanner{} + _ = checkValid(data, s) + return s.index, s.err +} + +// checkValid verifies that data is valid JSON-encoded data. +// scan is passed in for use by checkValid to avoid an allocation. +func checkValid(data []byte, scan *scanner) error { + scan.reset() + for _, c := range data { + scan.index++ + if scan.step(scan, c) == scanError { + return scan.err + } + } + if scan.eof() == scanError { + return scan.err + } + return nil +} + +func isSpace(c byte) bool { + return c == ' ' || c == '\t' || c == '\r' || c == '\n' +} + +func (s *scanner) reset() { + s.step = stateBeginValue + s.parseState = s.parseState[0:0] + s.err = nil +} + +// eof tells the scanner that the end of input has been reached. +// It returns a scan status just as s.step does. +func (s *scanner) eof() scanStatus { + if s.err != nil { + return scanError + } + if s.endTop { + return scanEnd + } + s.step(s, ' ') + if s.endTop { + return scanEnd + } + if s.err == nil { + s.err = fmt.Errorf("unexpected end of JSON input") + } + return scanError +} + +// pushParseState pushes a new parse state p onto the parse stack. +// an error state is returned if maxNestingDepth was exceeded, otherwise successState is returned. +func (s *scanner) pushParseState(c byte, newParseState int, successState scanStatus) scanStatus { + s.parseState = append(s.parseState, newParseState) + if len(s.parseState) <= maxNestingDepth { + return successState + } + return s.error(c, "exceeded max depth") +} + +// popParseState pops a parse state (already obtained) off the stack +// and updates s.step accordingly. +func (s *scanner) popParseState() { + n := len(s.parseState) - 1 + s.parseState = s.parseState[0:n] + if n == 0 { + s.step = stateEndTop + s.endTop = true + } else { + s.step = stateEndValue + } +} + +// stateBeginValueOrEmpty is the state after reading `[`. +func stateBeginValueOrEmpty(s *scanner, c byte) scanStatus { + if c <= ' ' && isSpace(c) { + return scanSkipSpace + } + if c == ']' { + return stateEndValue(s, c) + } + return stateBeginValue(s, c) +} + +// stateBeginValue is the state at the beginning of the input. +func stateBeginValue(s *scanner, c byte) scanStatus { + if c <= ' ' && isSpace(c) { + return scanSkipSpace + } + switch c { + case '{': + s.step = stateBeginStringOrEmpty + return s.pushParseState(c, parseObjectKey, scanBeginObject) + case '[': + s.step = stateBeginValueOrEmpty + return s.pushParseState(c, parseArrayValue, scanBeginArray) + case '"': + s.step = stateInString + return scanBeginLiteral + case '-': + s.step = stateNeg + return scanBeginLiteral + case '0': // beginning of 0.123 + s.step = state0 + return scanBeginLiteral + case 't': // beginning of true + s.step = stateT + return scanBeginLiteral + case 'f': // beginning of false + s.step = stateF + return scanBeginLiteral + case 'n': // beginning of null + s.step = stateN + return scanBeginLiteral + } + if '1' <= c && c <= '9' { // beginning of 1234.5 + s.step = state1 + return scanBeginLiteral + } + return s.error(c, "looking for beginning of value") +} + +// stateBeginStringOrEmpty is the state after reading `{`. +func stateBeginStringOrEmpty(s *scanner, c byte) scanStatus { + if c <= ' ' && isSpace(c) { + return scanSkipSpace + } + if c == '}' { + n := len(s.parseState) + s.parseState[n-1] = parseObjectValue + return stateEndValue(s, c) + } + return stateBeginString(s, c) +} + +// stateBeginString is the state after reading `{"key": value,`. +func stateBeginString(s *scanner, c byte) scanStatus { + if c <= ' ' && isSpace(c) { + return scanSkipSpace + } + if c == '"' { + s.step = stateInString + return scanBeginLiteral + } + return s.error(c, "looking for beginning of object key string") +} + +// stateEndValue is the state after completing a value, +// such as after reading `{}` or `true` or `["x"`. +func stateEndValue(s *scanner, c byte) scanStatus { + n := len(s.parseState) + if n == 0 { + // Completed top-level before the current byte. + s.step = stateEndTop + s.endTop = true + return stateEndTop(s, c) + } + if c <= ' ' && isSpace(c) { + s.step = stateEndValue + return scanSkipSpace + } + ps := s.parseState[n-1] + switch ps { + case parseObjectKey: + if c == ':' { + s.parseState[n-1] = parseObjectValue + s.step = stateBeginValue + return scanObjectKey + } + return s.error(c, "after object key") + case parseObjectValue: + if c == ',' { + s.parseState[n-1] = parseObjectKey + s.step = stateBeginString + return scanObjectValue + } + if c == '}' { + s.popParseState() + return scanEndObject + } + return s.error(c, "after object key:value pair") + case parseArrayValue: + if c == ',' { + s.step = stateBeginValue + return scanArrayValue + } + if c == ']' { + s.popParseState() + return scanEndArray + } + return s.error(c, "after array element") + } + return s.error(c, "") +} + +// stateEndTop is the state after finishing the top-level value, +// such as after reading `{}` or `[1,2,3]`. +// Only space characters should be seen now. +func stateEndTop(s *scanner, c byte) scanStatus { + if c != ' ' && c != '\t' && c != '\r' && c != '\n' { + // Complain about non-space byte on next call. + s.error(c, "after top-level value") + } + return scanEnd +} + +// stateInString is the state after reading `"`. +func stateInString(s *scanner, c byte) scanStatus { + if c == '"' { + s.step = stateEndValue + return scanContinue + } + if c == '\\' { + s.step = stateInStringEsc + return scanContinue + } + if c < 0x20 { + return s.error(c, "in string literal") + } + return scanContinue +} + +// stateInStringEsc is the state after reading `"\` during a quoted string. +func stateInStringEsc(s *scanner, c byte) scanStatus { + switch c { + case 'b', 'f', 'n', 'r', 't', '\\', '/', '"': + s.step = stateInString + return scanContinue + case 'u': + s.step = stateInStringEscU + return scanContinue + } + return s.error(c, "in string escape code") +} + +// stateInStringEscU is the state after reading `"\u` during a quoted string. +func stateInStringEscU(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { + s.step = stateInStringEscU1 + return scanContinue + } + // numbers + return s.error(c, "in \\u hexadecimal character escape") +} + +// stateInStringEscU1 is the state after reading `"\u1` during a quoted string. +func stateInStringEscU1(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { + s.step = stateInStringEscU12 + return scanContinue + } + // numbers + return s.error(c, "in \\u hexadecimal character escape") +} + +// stateInStringEscU12 is the state after reading `"\u12` during a quoted string. +func stateInStringEscU12(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { + s.step = stateInStringEscU123 + return scanContinue + } + // numbers + return s.error(c, "in \\u hexadecimal character escape") +} + +// stateInStringEscU123 is the state after reading `"\u123` during a quoted string. +func stateInStringEscU123(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { + s.step = stateInString + return scanContinue + } + // numbers + return s.error(c, "in \\u hexadecimal character escape") +} + +// stateNeg is the state after reading `-` during a number. +func stateNeg(s *scanner, c byte) scanStatus { + if c == '0' { + s.step = state0 + return scanContinue + } + if '1' <= c && c <= '9' { + s.step = state1 + return scanContinue + } + return s.error(c, "in numeric literal") +} + +// state1 is the state after reading a non-zero integer during a number, +// such as after reading `1` or `100` but not `0`. +func state1(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' { + s.step = state1 + return scanContinue + } + return state0(s, c) +} + +// state0 is the state after reading `0` during a number. +func state0(s *scanner, c byte) scanStatus { + if c == '.' { + s.step = stateDot + return scanContinue + } + if c == 'e' || c == 'E' { + s.step = stateE + return scanContinue + } + return stateEndValue(s, c) +} + +// stateDot is the state after reading the integer and decimal point in a number, +// such as after reading `1.`. +func stateDot(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' { + s.step = stateDot0 + return scanContinue + } + return s.error(c, "after decimal point in numeric literal") +} + +// stateDot0 is the state after reading the integer, decimal point, and subsequent +// digits of a number, such as after reading `3.14`. +func stateDot0(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' { + return scanContinue + } + if c == 'e' || c == 'E' { + s.step = stateE + return scanContinue + } + return stateEndValue(s, c) +} + +// stateE is the state after reading the mantissa and e in a number, +// such as after reading `314e` or `0.314e`. +func stateE(s *scanner, c byte) scanStatus { + if c == '+' || c == '-' { + s.step = stateESign + return scanContinue + } + return stateESign(s, c) +} + +// stateESign is the state after reading the mantissa, e, and sign in a number, +// such as after reading `314e-` or `0.314e+`. +func stateESign(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' { + s.step = stateE0 + return scanContinue + } + return s.error(c, "in exponent of numeric literal") +} + +// stateE0 is the state after reading the mantissa, e, optional sign, +// and at least one digit of the exponent in a number, +// such as after reading `314e-2` or `0.314e+1` or `3.14e0`. +func stateE0(s *scanner, c byte) scanStatus { + if '0' <= c && c <= '9' { + return scanContinue + } + return stateEndValue(s, c) +} + +// stateT is the state after reading `t`. +func stateT(s *scanner, c byte) scanStatus { + if c == 'r' { + s.step = stateTr + return scanContinue + } + return s.error(c, "in literal true (expecting 'r')") +} + +// stateTr is the state after reading `tr`. +func stateTr(s *scanner, c byte) scanStatus { + if c == 'u' { + s.step = stateTru + return scanContinue + } + return s.error(c, "in literal true (expecting 'u')") +} + +// stateTru is the state after reading `tru`. +func stateTru(s *scanner, c byte) scanStatus { + if c == 'e' { + s.step = stateEndValue + return scanContinue + } + return s.error(c, "in literal true (expecting 'e')") +} + +// stateF is the state after reading `f`. +func stateF(s *scanner, c byte) scanStatus { + if c == 'a' { + s.step = stateFa + return scanContinue + } + return s.error(c, "in literal false (expecting 'a')") +} + +// stateFa is the state after reading `fa`. +func stateFa(s *scanner, c byte) scanStatus { + if c == 'l' { + s.step = stateFal + return scanContinue + } + return s.error(c, "in literal false (expecting 'l')") +} + +// stateFal is the state after reading `fal`. +func stateFal(s *scanner, c byte) scanStatus { + if c == 's' { + s.step = stateFals + return scanContinue + } + return s.error(c, "in literal false (expecting 's')") +} + +// stateFals is the state after reading `fals`. +func stateFals(s *scanner, c byte) scanStatus { + if c == 'e' { + s.step = stateEndValue + return scanContinue + } + return s.error(c, "in literal false (expecting 'e')") +} + +// stateN is the state after reading `n`. +func stateN(s *scanner, c byte) scanStatus { + if c == 'u' { + s.step = stateNu + return scanContinue + } + return s.error(c, "in literal null (expecting 'u')") +} + +// stateNu is the state after reading `nu`. +func stateNu(s *scanner, c byte) scanStatus { + if c == 'l' { + s.step = stateNul + return scanContinue + } + return s.error(c, "in literal null (expecting 'l')") +} + +// stateNul is the state after reading `nul`. +func stateNul(s *scanner, c byte) scanStatus { + if c == 'l' { + s.step = stateEndValue + return scanContinue + } + return s.error(c, "in literal null (expecting 'l')") +} + +// stateError is the state after reaching a syntax error, +// such as after reading `[1}` or `5.1.2`. +func stateError(s *scanner, c byte) scanStatus { + return scanError +} + +// error records an error and switches to the error state. +func (s *scanner) error(c byte, context string) scanStatus { + s.step = stateError + s.err = fmt.Errorf("invalid character <<%c>> %s", c, context) + return scanError +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/archive.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/archive.go new file mode 100644 index 00000000..fec11f08 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/archive.go @@ -0,0 +1,124 @@ +package magic + +import ( + "bytes" + "encoding/binary" +) + +var ( + // SevenZ matches a 7z archive. + SevenZ = prefix([]byte{0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C}) + // Gzip matches gzip files based on http://www.zlib.org/rfc-gzip.html#header-trailer. + Gzip = prefix([]byte{0x1f, 0x8b}) + // Fits matches an Flexible Image Transport System file. + Fits = prefix([]byte{ + 0x53, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x20, 0x20, 0x3D, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, + }) + // Xar matches an eXtensible ARchive format file. + Xar = prefix([]byte{0x78, 0x61, 0x72, 0x21}) + // Bz2 matches a bzip2 file. + Bz2 = prefix([]byte{0x42, 0x5A, 0x68}) + // Ar matches an ar (Unix) archive file. + Ar = prefix([]byte{0x21, 0x3C, 0x61, 0x72, 0x63, 0x68, 0x3E}) + // Deb matches a Debian package file. + Deb = offset([]byte{ + 0x64, 0x65, 0x62, 0x69, 0x61, 0x6E, 0x2D, + 0x62, 0x69, 0x6E, 0x61, 0x72, 0x79, + }, 8) + // Warc matches a Web ARChive file. + Warc = prefix([]byte("WARC/1.0"), []byte("WARC/1.1")) + // Cab matches a Microsoft Cabinet archive file. + Cab = prefix([]byte("MSCF\x00\x00\x00\x00")) + // Xz matches an xz compressed stream based on https://tukaani.org/xz/xz-file-format.txt. + Xz = prefix([]byte{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}) + // Lzip matches an Lzip compressed file. + Lzip = prefix([]byte{0x4c, 0x5a, 0x49, 0x50}) + // RPM matches an RPM or Delta RPM package file. + RPM = prefix([]byte{0xed, 0xab, 0xee, 0xdb}, []byte("drpm")) + // Cpio matches a cpio archive file. + Cpio = prefix([]byte("070707"), []byte("070701"), []byte("070702")) + // RAR matches a RAR archive file. + RAR = prefix([]byte("Rar!\x1A\x07\x00"), []byte("Rar!\x1A\x07\x01\x00")) +) + +// InstallShieldCab matches an InstallShield Cabinet archive file. +func InstallShieldCab(raw []byte, _ uint32) bool { + return len(raw) > 7 && + bytes.Equal(raw[0:4], []byte("ISc(")) && + raw[6] == 0 && + (raw[7] == 1 || raw[7] == 2 || raw[7] == 4) +} + +// Zstd matches a Zstandard archive file. +func Zstd(raw []byte, limit uint32) bool { + return len(raw) >= 4 && + (0x22 <= raw[0] && raw[0] <= 0x28 || raw[0] == 0x1E) && // Different Zstandard versions. + bytes.HasPrefix(raw[1:], []byte{0xB5, 0x2F, 0xFD}) +} + +// CRX matches a Chrome extension file: a zip archive prepended by a package header. +func CRX(raw []byte, limit uint32) bool { + const minHeaderLen = 16 + if len(raw) < minHeaderLen || !bytes.HasPrefix(raw, []byte("Cr24")) { + return false + } + pubkeyLen := binary.LittleEndian.Uint32(raw[8:12]) + sigLen := binary.LittleEndian.Uint32(raw[12:16]) + zipOffset := minHeaderLen + pubkeyLen + sigLen + if uint32(len(raw)) < zipOffset { + return false + } + return Zip(raw[zipOffset:], limit) +} + +// Tar matches a (t)ape (ar)chive file. +func Tar(raw []byte, _ uint32) bool { + // The "magic" header field for files in in UStar (POSIX IEEE P1003.1) archives + // has the prefix "ustar". The values of the remaining bytes in this field vary + // by archiver implementation. + if len(raw) >= 512 && bytes.HasPrefix(raw[257:], []byte{0x75, 0x73, 0x74, 0x61, 0x72}) { + return true + } + + if len(raw) < 256 { + return false + } + + // The older v7 format has no "magic" field, and therefore must be identified + // with heuristics based on legal ranges of values for other header fields: + // https://www.nationalarchives.gov.uk/PRONOM/Format/proFormatSearch.aspx?status=detailReport&id=385&strPageToDisplay=signatures + rules := []struct { + min, max uint8 + i int + }{ + {0x21, 0xEF, 0}, + {0x30, 0x37, 105}, + {0x20, 0x37, 106}, + {0x00, 0x00, 107}, + {0x30, 0x37, 113}, + {0x20, 0x37, 114}, + {0x00, 0x00, 115}, + {0x30, 0x37, 121}, + {0x20, 0x37, 122}, + {0x00, 0x00, 123}, + {0x30, 0x37, 134}, + {0x30, 0x37, 146}, + {0x30, 0x37, 153}, + {0x00, 0x37, 154}, + } + for _, r := range rules { + if raw[r.i] < r.min || raw[r.i] > r.max { + return false + } + } + + for _, i := range []uint8{135, 147, 155} { + if raw[i] != 0x00 && raw[i] != 0x20 { + return false + } + } + + return true +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/audio.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/audio.go new file mode 100644 index 00000000..d17e3248 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/audio.go @@ -0,0 +1,76 @@ +package magic + +import ( + "bytes" + "encoding/binary" +) + +var ( + // Flac matches a Free Lossless Audio Codec file. + Flac = prefix([]byte("\x66\x4C\x61\x43\x00\x00\x00\x22")) + // Midi matches a Musical Instrument Digital Interface file. + Midi = prefix([]byte("\x4D\x54\x68\x64")) + // Ape matches a Monkey's Audio file. + Ape = prefix([]byte("\x4D\x41\x43\x20\x96\x0F\x00\x00\x34\x00\x00\x00\x18\x00\x00\x00\x90\xE3")) + // MusePack matches a Musepack file. + MusePack = prefix([]byte("MPCK")) + // Au matches a Sun Microsystems au file. + Au = prefix([]byte("\x2E\x73\x6E\x64")) + // Amr matches an Adaptive Multi-Rate file. + Amr = prefix([]byte("\x23\x21\x41\x4D\x52")) + // Voc matches a Creative Voice file. + Voc = prefix([]byte("Creative Voice File")) + // M3u matches a Playlist file. + M3u = prefix([]byte("#EXTM3U")) + // AAC matches an Advanced Audio Coding file. + AAC = prefix([]byte{0xFF, 0xF1}, []byte{0xFF, 0xF9}) +) + +// Mp3 matches an mp3 file. +func Mp3(raw []byte, limit uint32) bool { + if len(raw) < 3 { + return false + } + + if bytes.HasPrefix(raw, []byte("ID3")) { + // MP3s with an ID3v2 tag will start with "ID3" + // ID3v1 tags, however appear at the end of the file. + return true + } + + // Match MP3 files without tags + switch binary.BigEndian.Uint16(raw[:2]) & 0xFFFE { + case 0xFFFA: + // MPEG ADTS, layer III, v1 + return true + case 0xFFF2: + // MPEG ADTS, layer III, v2 + return true + case 0xFFE2: + // MPEG ADTS, layer III, v2.5 + return true + } + + return false +} + +// Wav matches a Waveform Audio File Format file. +func Wav(raw []byte, limit uint32) bool { + return len(raw) > 12 && + bytes.Equal(raw[:4], []byte("RIFF")) && + bytes.Equal(raw[8:12], []byte{0x57, 0x41, 0x56, 0x45}) +} + +// Aiff matches Audio Interchange File Format file. +func Aiff(raw []byte, limit uint32) bool { + return len(raw) > 12 && + bytes.Equal(raw[:4], []byte{0x46, 0x4F, 0x52, 0x4D}) && + bytes.Equal(raw[8:12], []byte{0x41, 0x49, 0x46, 0x46}) +} + +// Qcp matches a Qualcomm Pure Voice file. +func Qcp(raw []byte, limit uint32) bool { + return len(raw) > 12 && + bytes.Equal(raw[:4], []byte("RIFF")) && + bytes.Equal(raw[8:12], []byte("QLCM")) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go new file mode 100644 index 00000000..f1e94498 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go @@ -0,0 +1,198 @@ +package magic + +import ( + "bytes" + "debug/macho" + "encoding/binary" +) + +var ( + // Lnk matches Microsoft lnk binary format. + Lnk = prefix([]byte{0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00}) + // Wasm matches a web assembly File Format file. + Wasm = prefix([]byte{0x00, 0x61, 0x73, 0x6D}) + // Exe matches a Windows/DOS executable file. + Exe = prefix([]byte{0x4D, 0x5A}) + // Elf matches an Executable and Linkable Format file. + Elf = prefix([]byte{0x7F, 0x45, 0x4C, 0x46}) + // Nes matches a Nintendo Entertainment system ROM file. + Nes = prefix([]byte{0x4E, 0x45, 0x53, 0x1A}) + // SWF matches an Adobe Flash swf file. + SWF = prefix([]byte("CWS"), []byte("FWS"), []byte("ZWS")) + // Torrent has bencoded text in the beginning. + Torrent = prefix([]byte("d8:announce")) +) + +// Java bytecode and Mach-O binaries share the same magic number. +// More info here https://github.com/threatstack/libmagic/blob/master/magic/Magdir/cafebabe +func classOrMachOFat(in []byte) bool { + // There should be at least 8 bytes for both of them because the only way to + // quickly distinguish them is by comparing byte at position 7 + if len(in) < 8 { + return false + } + + return bytes.HasPrefix(in, []byte{0xCA, 0xFE, 0xBA, 0xBE}) +} + +// Class matches a java class file. +func Class(raw []byte, limit uint32) bool { + return classOrMachOFat(raw) && raw[7] > 30 +} + +// MachO matches Mach-O binaries format. +func MachO(raw []byte, limit uint32) bool { + if classOrMachOFat(raw) && raw[7] < 20 { + return true + } + + if len(raw) < 4 { + return false + } + + be := binary.BigEndian.Uint32(raw) + le := binary.LittleEndian.Uint32(raw) + + return be == macho.Magic32 || + le == macho.Magic32 || + be == macho.Magic64 || + le == macho.Magic64 +} + +// Dbf matches a dBase file. +// https://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm +func Dbf(raw []byte, limit uint32) bool { + if len(raw) < 68 { + return false + } + + // 3rd and 4th bytes contain the last update month and day of month. + if !(0 < raw[2] && raw[2] < 13 && 0 < raw[3] && raw[3] < 32) { + return false + } + + // 12, 13, 30, 31 are reserved bytes and always filled with 0x00. + if raw[12] != 0x00 || raw[13] != 0x00 || raw[30] != 0x00 || raw[31] != 0x00 { + return false + } + // Production MDX flag; + // 0x01 if a production .MDX file exists for this table; + // 0x00 if no .MDX file exists. + if raw[28] > 0x01 { + return false + } + + // dbf type is dictated by the first byte. + dbfTypes := []byte{ + 0x02, 0x03, 0x04, 0x05, 0x30, 0x31, 0x32, 0x42, 0x62, 0x7B, 0x82, + 0x83, 0x87, 0x8A, 0x8B, 0x8E, 0xB3, 0xCB, 0xE5, 0xF5, 0xF4, 0xFB, + } + for _, b := range dbfTypes { + if raw[0] == b { + return true + } + } + + return false +} + +// ElfObj matches an object file. +func ElfObj(raw []byte, limit uint32) bool { + return len(raw) > 17 && ((raw[16] == 0x01 && raw[17] == 0x00) || + (raw[16] == 0x00 && raw[17] == 0x01)) +} + +// ElfExe matches an executable file. +func ElfExe(raw []byte, limit uint32) bool { + return len(raw) > 17 && ((raw[16] == 0x02 && raw[17] == 0x00) || + (raw[16] == 0x00 && raw[17] == 0x02)) +} + +// ElfLib matches a shared library file. +func ElfLib(raw []byte, limit uint32) bool { + return len(raw) > 17 && ((raw[16] == 0x03 && raw[17] == 0x00) || + (raw[16] == 0x00 && raw[17] == 0x03)) +} + +// ElfDump matches a core dump file. +func ElfDump(raw []byte, limit uint32) bool { + return len(raw) > 17 && ((raw[16] == 0x04 && raw[17] == 0x00) || + (raw[16] == 0x00 && raw[17] == 0x04)) +} + +// Dcm matches a DICOM medical format file. +func Dcm(raw []byte, limit uint32) bool { + return len(raw) > 131 && + bytes.Equal(raw[128:132], []byte{0x44, 0x49, 0x43, 0x4D}) +} + +// Marc matches a MARC21 (MAchine-Readable Cataloging) file. +func Marc(raw []byte, limit uint32) bool { + // File is at least 24 bytes ("leader" field size). + if len(raw) < 24 { + return false + } + + // Fixed bytes at offset 20. + if !bytes.Equal(raw[20:24], []byte("4500")) { + return false + } + + // First 5 bytes are ASCII digits. + for i := 0; i < 5; i++ { + if raw[i] < '0' || raw[i] > '9' { + return false + } + } + + // Field terminator is present in first 2048 bytes. + return bytes.Contains(raw[:min(2048, len(raw))], []byte{0x1E}) +} + +// Glb matches a glTF model format file. +// GLB is the binary file format representation of 3D models saved in +// the GL transmission Format (glTF). +// 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 | ... | +// +// 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) | +func TzIf(raw []byte, limit uint32) bool { + // File is at least 44 bytes (header size). + if len(raw) < 44 { + return false + } + + if !bytes.HasPrefix(raw, []byte("TZif")) { + return false + } + + // Field "typecnt" MUST not be zero. + if binary.BigEndian.Uint32(raw[36:40]) == 0 { + return false + } + + // Version has to be NUL (0x00), '2' (0x32) or '3' (0x33). + return raw[4] == 0x00 || raw[4] == 0x32 || raw[4] == 0x33 +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/database.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/database.go new file mode 100644 index 00000000..cb1fed12 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/database.go @@ -0,0 +1,13 @@ +package magic + +var ( + // Sqlite matches an SQLite database file. + Sqlite = prefix([]byte{ + 0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00, + }) + // MsAccessAce matches Microsoft Access dababase file. + MsAccessAce = offset([]byte("Standard ACE DB"), 4) + // MsAccessMdb matches legacy Microsoft Access database file (JET, 2003 and earlier). + MsAccessMdb = offset([]byte("Standard Jet DB"), 4) +) diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/document.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/document.go new file mode 100644 index 00000000..b3b26d5a --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/document.go @@ -0,0 +1,62 @@ +package magic + +import "bytes" + +var ( + // Pdf matches a Portable Document Format file. + // https://github.com/file/file/blob/11010cc805546a3e35597e67e1129a481aed40e8/magic/Magdir/pdf + Pdf = prefix( + // usual pdf signature + []byte("%PDF-"), + // new-line prefixed signature + []byte("\012%PDF-"), + // UTF-8 BOM prefixed signature + []byte("\xef\xbb\xbf%PDF-"), + ) + // Fdf matches a Forms Data Format file. + Fdf = prefix([]byte("%FDF")) + // Mobi matches a Mobi file. + Mobi = offset([]byte("BOOKMOBI"), 60) + // Lit matches a Microsoft Lit file. + Lit = prefix([]byte("ITOLITLS")) +) + +// DjVu matches a DjVu file. +func DjVu(raw []byte, limit uint32) bool { + if len(raw) < 12 { + return false + } + if !bytes.HasPrefix(raw, []byte{0x41, 0x54, 0x26, 0x54, 0x46, 0x4F, 0x52, 0x4D}) { + return false + } + return bytes.HasPrefix(raw[12:], []byte("DJVM")) || + bytes.HasPrefix(raw[12:], []byte("DJVU")) || + bytes.HasPrefix(raw[12:], []byte("DJVI")) || + bytes.HasPrefix(raw[12:], []byte("THUM")) +} + +// P7s matches an .p7s signature File (PEM, Base64). +func P7s(raw []byte, limit uint32) bool { + // Check for PEM Encoding. + if bytes.HasPrefix(raw, []byte("-----BEGIN PKCS7")) { + return true + } + // Check if DER Encoding is long enough. + if len(raw) < 20 { + return false + } + // Magic Bytes for the signedData ASN.1 encoding. + startHeader := [][]byte{{0x30, 0x80}, {0x30, 0x81}, {0x30, 0x82}, {0x30, 0x83}, {0x30, 0x84}} + signedDataMatch := []byte{0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07} + // Check if Header is correct. There are multiple valid headers. + for i, match := range startHeader { + // If first bytes match, then check for ASN.1 Object Type. + if bytes.HasPrefix(raw, match) { + if bytes.HasPrefix(raw[i+2:], signedDataMatch) { + return true + } + } + } + + return false +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/font.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/font.go new file mode 100644 index 00000000..43af2821 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/font.go @@ -0,0 +1,39 @@ +package magic + +import ( + "bytes" +) + +var ( + // Woff matches a Web Open Font Format file. + Woff = prefix([]byte("wOFF")) + // Woff2 matches a Web Open Font Format version 2 file. + Woff2 = prefix([]byte("wOF2")) + // Otf matches an OpenType font file. + Otf = prefix([]byte{0x4F, 0x54, 0x54, 0x4F, 0x00}) +) + +// Ttf matches a TrueType font file. +func Ttf(raw []byte, limit uint32) bool { + if !bytes.HasPrefix(raw, []byte{0x00, 0x01, 0x00, 0x00}) { + return false + } + return !MsAccessAce(raw, limit) && !MsAccessMdb(raw, limit) +} + +// Eot matches an Embedded OpenType font file. +func Eot(raw []byte, limit uint32) bool { + return len(raw) > 35 && + bytes.Equal(raw[34:36], []byte{0x4C, 0x50}) && + (bytes.Equal(raw[8:11], []byte{0x02, 0x00, 0x01}) || + bytes.Equal(raw[8:11], []byte{0x01, 0x00, 0x00}) || + bytes.Equal(raw[8:11], []byte{0x02, 0x00, 0x02})) +} + +// Ttc matches a TrueType Collection font file. +func Ttc(raw []byte, limit uint32) bool { + return len(raw) > 7 && + bytes.HasPrefix(raw, []byte("ttcf")) && + (bytes.Equal(raw[4:8], []byte{0x00, 0x01, 0x00, 0x00}) || + bytes.Equal(raw[4:8], []byte{0x00, 0x02, 0x00, 0x00})) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ftyp.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ftyp.go new file mode 100644 index 00000000..6575b4ae --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ftyp.go @@ -0,0 +1,88 @@ +package magic + +import "bytes" + +var ( + // AVIF matches an AV1 Image File Format still or animated. + // Wikipedia page seems outdated listing image/avif-sequence for animations. + // https://github.com/AOMediaCodec/av1-avif/issues/59 + AVIF = ftyp([]byte("avif"), []byte("avis")) + // Mp4 matches an MP4 file. + Mp4 = ftyp( + []byte("avc1"), []byte("dash"), []byte("iso2"), []byte("iso3"), + []byte("iso4"), []byte("iso5"), []byte("iso6"), []byte("isom"), + []byte("mmp4"), []byte("mp41"), []byte("mp42"), []byte("mp4v"), + []byte("mp71"), []byte("MSNV"), []byte("NDAS"), []byte("NDSC"), + []byte("NSDC"), []byte("NSDH"), []byte("NDSM"), []byte("NDSP"), + []byte("NDSS"), []byte("NDXC"), []byte("NDXH"), []byte("NDXM"), + []byte("NDXP"), []byte("NDXS"), []byte("F4V "), []byte("F4P "), + ) + // ThreeGP matches a 3GPP file. + ThreeGP = ftyp( + []byte("3gp1"), []byte("3gp2"), []byte("3gp3"), []byte("3gp4"), + []byte("3gp5"), []byte("3gp6"), []byte("3gp7"), []byte("3gs7"), + []byte("3ge6"), []byte("3ge7"), []byte("3gg6"), + ) + // ThreeG2 matches a 3GPP2 file. + ThreeG2 = ftyp( + []byte("3g24"), []byte("3g25"), []byte("3g26"), []byte("3g2a"), + []byte("3g2b"), []byte("3g2c"), []byte("KDDI"), + ) + // AMp4 matches an audio MP4 file. + AMp4 = ftyp( + // audio for Adobe Flash Player 9+ + []byte("F4A "), []byte("F4B "), + // Apple iTunes AAC-LC (.M4A) Audio + []byte("M4B "), []byte("M4P "), + // MPEG-4 (.MP4) for SonyPSP + []byte("MSNV"), + // Nero Digital AAC Audio + []byte("NDAS"), + ) + // Mqv matches a Sony / Mobile QuickTime file. + Mqv = ftyp([]byte("mqt ")) + // M4a matches an audio M4A file. + M4a = ftyp([]byte("M4A ")) + // M4v matches an Appl4 M4V video file. + M4v = ftyp([]byte("M4V "), []byte("M4VH"), []byte("M4VP")) + // Heic matches a High Efficiency Image Coding (HEIC) file. + Heic = ftyp([]byte("heic"), []byte("heix")) + // HeicSequence matches a High Efficiency Image Coding (HEIC) file sequence. + HeicSequence = ftyp([]byte("hevc"), []byte("hevx")) + // Heif matches a High Efficiency Image File Format (HEIF) file. + Heif = ftyp([]byte("mif1"), []byte("heim"), []byte("heis"), []byte("avic")) + // HeifSequence matches a High Efficiency Image File Format (HEIF) file sequence. + HeifSequence = ftyp([]byte("msf1"), []byte("hevm"), []byte("hevs"), []byte("avcs")) + // TODO: add support for remaining video formats at ftyps.com. +) + +// QuickTime matches a QuickTime File Format file. +// https://www.loc.gov/preservation/digital/formats/fdd/fdd000052.shtml +// https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html#//apple_ref/doc/uid/TP40000939-CH203-38190 +// https://github.com/apache/tika/blob/0f5570691133c75ac4472c3340354a6c4080b104/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml#L7758-L7777 +func QuickTime(raw []byte, _ uint32) bool { + if len(raw) < 12 { + return false + } + // First 4 bytes represent the size of the atom as unsigned int. + // Next 4 bytes are the type of the atom. + // For `ftyp` atoms check if first byte in size is 0, otherwise, a text file + // which happens to contain 'ftypqt ' at index 4 will trigger a false positive. + if bytes.Equal(raw[4:12], []byte("ftypqt ")) || + bytes.Equal(raw[4:12], []byte("ftypmoov")) { + return raw[0] == 0x00 + } + basicAtomTypes := [][]byte{ + []byte("moov\x00"), + []byte("mdat\x00"), + []byte("free\x00"), + []byte("skip\x00"), + []byte("pnot\x00"), + } + for _, a := range basicAtomTypes { + if bytes.Equal(raw[4:9], a) { + return true + } + } + return bytes.Equal(raw[:8], []byte("\x00\x00\x00\x08wide")) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/geo.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/geo.go new file mode 100644 index 00000000..f077e167 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/geo.go @@ -0,0 +1,55 @@ +package magic + +import ( + "bytes" + "encoding/binary" +) + +// Shp matches a shape format file. +// https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf +func Shp(raw []byte, limit uint32) bool { + if len(raw) < 112 { + return false + } + + if !(binary.BigEndian.Uint32(raw[0:4]) == 9994 && + binary.BigEndian.Uint32(raw[4:8]) == 0 && + binary.BigEndian.Uint32(raw[8:12]) == 0 && + binary.BigEndian.Uint32(raw[12:16]) == 0 && + binary.BigEndian.Uint32(raw[16:20]) == 0 && + binary.BigEndian.Uint32(raw[20:24]) == 0 && + binary.LittleEndian.Uint32(raw[28:32]) == 1000) { + return false + } + + shapeTypes := []int{ + 0, // Null shape + 1, // Point + 3, // Polyline + 5, // Polygon + 8, // MultiPoint + 11, // PointZ + 13, // PolylineZ + 15, // PolygonZ + 18, // MultiPointZ + 21, // PointM + 23, // PolylineM + 25, // PolygonM + 28, // MultiPointM + 31, // MultiPatch + } + + for _, st := range shapeTypes { + if st == int(binary.LittleEndian.Uint32(raw[108:112])) { + return true + } + } + + return false +} + +// Shx matches a shape index format file. +// https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf +func Shx(raw []byte, limit uint32) bool { + return bytes.HasPrefix(raw, []byte{0x00, 0x00, 0x27, 0x0A}) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/image.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/image.go new file mode 100644 index 00000000..0eb7e95f --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/image.go @@ -0,0 +1,110 @@ +package magic + +import "bytes" + +var ( + // Png matches a Portable Network Graphics file. + // https://www.w3.org/TR/PNG/ + Png = prefix([]byte{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}) + // Apng matches an Animated Portable Network Graphics file. + // https://wiki.mozilla.org/APNG_Specification + Apng = offset([]byte("acTL"), 37) + // Jpg matches a Joint Photographic Experts Group file. + Jpg = prefix([]byte{0xFF, 0xD8, 0xFF}) + // Jp2 matches a JPEG 2000 Image file (ISO 15444-1). + Jp2 = jpeg2k([]byte{0x6a, 0x70, 0x32, 0x20}) + // Jpx matches a JPEG 2000 Image file (ISO 15444-2). + Jpx = jpeg2k([]byte{0x6a, 0x70, 0x78, 0x20}) + // Jpm matches a JPEG 2000 Image file (ISO 15444-6). + Jpm = jpeg2k([]byte{0x6a, 0x70, 0x6D, 0x20}) + // Gif matches a Graphics Interchange Format file. + Gif = prefix([]byte("GIF87a"), []byte("GIF89a")) + // Bmp matches a bitmap image file. + Bmp = prefix([]byte{0x42, 0x4D}) + // Ps matches a PostScript file. + Ps = prefix([]byte("%!PS-Adobe-")) + // Psd matches a Photoshop Document file. + Psd = prefix([]byte("8BPS")) + // Ico matches an ICO file. + Ico = prefix([]byte{0x00, 0x00, 0x01, 0x00}, []byte{0x00, 0x00, 0x02, 0x00}) + // Icns matches an ICNS (Apple Icon Image format) file. + Icns = prefix([]byte("icns")) + // Tiff matches a Tagged Image File Format file. + Tiff = prefix([]byte{0x49, 0x49, 0x2A, 0x00}, []byte{0x4D, 0x4D, 0x00, 0x2A}) + // Bpg matches a Better Portable Graphics file. + Bpg = prefix([]byte{0x42, 0x50, 0x47, 0xFB}) + // Xcf matches GIMP image data. + Xcf = prefix([]byte("gimp xcf")) + // Pat matches GIMP pattern data. + Pat = offset([]byte("GPAT"), 20) + // Gbr matches GIMP brush data. + Gbr = offset([]byte("GIMP"), 20) + // Hdr matches Radiance HDR image. + // https://web.archive.org/web/20060913152809/http://local.wasp.uwa.edu.au/~pbourke/dataformats/pic/ + Hdr = prefix([]byte("#?RADIANCE\n")) + // Xpm matches X PixMap image data. + Xpm = prefix([]byte{0x2F, 0x2A, 0x20, 0x58, 0x50, 0x4D, 0x20, 0x2A, 0x2F}) + // Jxs matches a JPEG XS coded image file (ISO/IEC 21122-3). + Jxs = prefix([]byte{0x00, 0x00, 0x00, 0x0C, 0x4A, 0x58, 0x53, 0x20, 0x0D, 0x0A, 0x87, 0x0A}) + // Jxr matches Microsoft HD JXR photo file. + Jxr = prefix([]byte{0x49, 0x49, 0xBC, 0x01}) +) + +func jpeg2k(sig []byte) Detector { + return func(raw []byte, _ uint32) bool { + if len(raw) < 24 { + return false + } + + if !bytes.Equal(raw[4:8], []byte{0x6A, 0x50, 0x20, 0x20}) && + !bytes.Equal(raw[4:8], []byte{0x6A, 0x50, 0x32, 0x20}) { + return false + } + return bytes.Equal(raw[20:24], sig) + } +} + +// Webp matches a WebP file. +func Webp(raw []byte, _ uint32) bool { + return len(raw) > 12 && + bytes.Equal(raw[0:4], []byte("RIFF")) && + bytes.Equal(raw[8:12], []byte{0x57, 0x45, 0x42, 0x50}) +} + +// Dwg matches a CAD drawing file. +func Dwg(raw []byte, _ uint32) bool { + if len(raw) < 6 || raw[0] != 0x41 || raw[1] != 0x43 { + return false + } + dwgVersions := [][]byte{ + {0x31, 0x2E, 0x34, 0x30}, + {0x31, 0x2E, 0x35, 0x30}, + {0x32, 0x2E, 0x31, 0x30}, + {0x31, 0x30, 0x30, 0x32}, + {0x31, 0x30, 0x30, 0x33}, + {0x31, 0x30, 0x30, 0x34}, + {0x31, 0x30, 0x30, 0x36}, + {0x31, 0x30, 0x30, 0x39}, + {0x31, 0x30, 0x31, 0x32}, + {0x31, 0x30, 0x31, 0x34}, + {0x31, 0x30, 0x31, 0x35}, + {0x31, 0x30, 0x31, 0x38}, + {0x31, 0x30, 0x32, 0x31}, + {0x31, 0x30, 0x32, 0x34}, + {0x31, 0x30, 0x33, 0x32}, + } + + for _, d := range dwgVersions { + if bytes.Equal(raw[2:6], d) { + return true + } + } + + return false +} + +// Jxl matches JPEG XL image file. +func Jxl(raw []byte, _ uint32) bool { + return bytes.HasPrefix(raw, []byte{0xFF, 0x0A}) || + bytes.HasPrefix(raw, []byte("\x00\x00\x00\x0cJXL\x20\x0d\x0a\x87\x0a")) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go new file mode 100644 index 00000000..34b84f40 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go @@ -0,0 +1,241 @@ +// Package magic holds the matching functions used to find MIME types. +package magic + +import ( + "bytes" + "fmt" +) + +type ( + // Detector receiveѕ the raw data of a file and returns whether the data + // meets any conditions. The limit parameter is an upper limit to the number + // of bytes received and is used to tell if the byte slice represents the + // whole file or is just the header of a file: len(raw) < limit or len(raw)>limit. + Detector func(raw []byte, limit uint32) bool + xmlSig struct { + // the local name of the root tag + localName []byte + // the namespace of the XML document + xmlns []byte + } +) + +// prefix creates a Detector which returns true if any of the provided signatures +// is the prefix of the raw input. +func prefix(sigs ...[]byte) Detector { + return func(raw []byte, limit uint32) bool { + for _, s := range sigs { + if bytes.HasPrefix(raw, s) { + return true + } + } + return false + } +} + +// offset creates a Detector which returns true if the provided signature can be +// found at offset in the raw input. +func offset(sig []byte, offset int) Detector { + return func(raw []byte, limit uint32) bool { + return len(raw) > offset && bytes.HasPrefix(raw[offset:], sig) + } +} + +// ciPrefix is like prefix but the check is case insensitive. +func ciPrefix(sigs ...[]byte) Detector { + return func(raw []byte, limit uint32) bool { + for _, s := range sigs { + if ciCheck(s, raw) { + return true + } + } + return false + } +} +func ciCheck(sig, raw []byte) bool { + if len(raw) < len(sig)+1 { + return false + } + // perform case insensitive check + for i, b := range sig { + db := raw[i] + if 'A' <= b && b <= 'Z' { + db &= 0xDF + } + if b != db { + return false + } + } + + return true +} + +// xml creates a Detector which returns true if any of the provided XML signatures +// matches the raw input. +func xml(sigs ...xmlSig) Detector { + return func(raw []byte, limit uint32) bool { + raw = trimLWS(raw) + if len(raw) == 0 { + return false + } + for _, s := range sigs { + if xmlCheck(s, raw) { + return true + } + } + return false + } +} +func xmlCheck(sig xmlSig, raw []byte) bool { + raw = raw[:min(len(raw), 512)] + + if len(sig.localName) == 0 { + return bytes.Index(raw, sig.xmlns) > 0 + } + if len(sig.xmlns) == 0 { + return bytes.Index(raw, sig.localName) > 0 + } + + localNameIndex := bytes.Index(raw, sig.localName) + return localNameIndex != -1 && localNameIndex < bytes.Index(raw, sig.xmlns) +} + +// markup creates a Detector which returns true is any of the HTML signatures +// matches the raw input. +func markup(sigs ...[]byte) Detector { + return func(raw []byte, limit uint32) bool { + if bytes.HasPrefix(raw, []byte{0xEF, 0xBB, 0xBF}) { + // We skip the UTF-8 BOM if present to ensure we correctly + // process any leading whitespace. The presence of the BOM + // is taken into account during charset detection in charset.go. + raw = trimLWS(raw[3:]) + } else { + raw = trimLWS(raw) + } + if len(raw) == 0 { + return false + } + for _, s := range sigs { + if markupCheck(s, raw) { + return true + } + } + return false + } +} +func markupCheck(sig, raw []byte) bool { + if len(raw) < len(sig)+1 { + return false + } + + // perform case insensitive check + for i, b := range sig { + db := raw[i] + if 'A' <= b && b <= 'Z' { + db &= 0xDF + } + if b != db { + return false + } + } + // Next byte must be space or right angle bracket. + if db := raw[len(sig)]; db != ' ' && db != '>' { + return false + } + + return true +} + +// ftyp creates a Detector which returns true if any of the FTYP signatures +// matches the raw input. +func ftyp(sigs ...[]byte) Detector { + return func(raw []byte, limit uint32) bool { + if len(raw) < 12 { + return false + } + for _, s := range sigs { + if bytes.Equal(raw[4:12], append([]byte("ftyp"), s...)) { + return true + } + } + return false + } +} + +func newXMLSig(localName, xmlns string) xmlSig { + ret := xmlSig{xmlns: []byte(xmlns)} + if localName != "" { + ret.localName = []byte(fmt.Sprintf("<%s", localName)) + } + + return ret +} + +// A valid shebang starts with the "#!" characters, +// followed by any number of spaces, +// followed by the path to the interpreter, +// and, optionally, followed by the arguments for the interpreter. +// +// Ex: +// +// #! /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 { + for _, s := range sigs { + if shebangCheck(s, firstLine(raw)) { + return true + } + } + return false + } +} + +func shebangCheck(sig, raw []byte) bool { + if len(raw) < len(sig)+2 { + return false + } + if raw[0] != '#' || raw[1] != '!' { + return false + } + + return bytes.Equal(trimLWS(trimRWS(raw[2:])), sig) +} + +// trimLWS trims whitespace from beginning of the input. +func trimLWS(in []byte) []byte { + firstNonWS := 0 + for ; firstNonWS < len(in) && isWS(in[firstNonWS]); firstNonWS++ { + } + + return in[firstNonWS:] +} + +// trimRWS trims whitespace from the end of the input. +func trimRWS(in []byte) []byte { + lastNonWS := len(in) - 1 + for ; lastNonWS > 0 && isWS(in[lastNonWS]); lastNonWS-- { + } + + return in[:lastNonWS+1] +} + +func firstLine(in []byte) []byte { + lineEnd := 0 + for ; lineEnd < len(in) && in[lineEnd] != '\n'; lineEnd++ { + } + + return in[:lineEnd] +} + +func isWS(b byte) bool { + return b == '\t' || b == '\n' || b == '\x0c' || b == '\r' || b == ' ' +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ms_office.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ms_office.go new file mode 100644 index 00000000..5964ce59 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ms_office.go @@ -0,0 +1,225 @@ +package magic + +import ( + "bytes" + "encoding/binary" +) + +var ( + xlsxSigFiles = []string{ + "xl/worksheets/", + "xl/drawings/", + "xl/theme/", + "xl/_rels/", + "xl/styles.xml", + "xl/workbook.xml", + "xl/sharedStrings.xml", + } + docxSigFiles = []string{ + "word/media/", + "word/_rels/document.xml.rels", + "word/document.xml", + "word/styles.xml", + "word/fontTable.xml", + "word/settings.xml", + "word/numbering.xml", + "word/header", + "word/footer", + } + pptxSigFiles = []string{ + "ppt/slides/", + "ppt/media/", + "ppt/slideLayouts/", + "ppt/theme/", + "ppt/slideMasters/", + "ppt/tags/", + "ppt/notesMasters/", + "ppt/_rels/", + "ppt/handoutMasters/", + "ppt/notesSlides/", + "ppt/presentation.xml", + "ppt/tableStyles.xml", + "ppt/presProps.xml", + "ppt/viewProps.xml", + } +) + +// Xlsx matches a Microsoft Excel 2007 file. +func Xlsx(raw []byte, limit uint32) bool { + return zipContains(raw, xlsxSigFiles...) +} + +// Docx matches a Microsoft Word 2007 file. +func Docx(raw []byte, limit uint32) bool { + return zipContains(raw, docxSigFiles...) +} + +// Pptx matches a Microsoft PowerPoint 2007 file. +func Pptx(raw []byte, limit uint32) bool { + return zipContains(raw, pptxSigFiles...) +} + +// Ole matches an Open Linking and Embedding file. +// +// https://en.wikipedia.org/wiki/Object_Linking_and_Embedding +func Ole(raw []byte, limit uint32) bool { + return bytes.HasPrefix(raw, []byte{0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1}) +} + +// Aaf matches an Advanced Authoring Format file. +// See: https://pyaaf.readthedocs.io/en/latest/about.html +// See: https://en.wikipedia.org/wiki/Advanced_Authoring_Format +func Aaf(raw []byte, limit uint32) bool { + if len(raw) < 31 { + return false + } + return bytes.HasPrefix(raw[8:], []byte{0x41, 0x41, 0x46, 0x42, 0x0D, 0x00, 0x4F, 0x4D}) && + (raw[30] == 0x09 || raw[30] == 0x0C) +} + +// Doc matches a Microsoft Word 97-2003 file. +// See: https://github.com/decalage2/oletools/blob/412ee36ae45e70f42123e835871bac956d958461/oletools/common/clsid.py +func Doc(raw []byte, _ uint32) bool { + clsids := [][]byte{ + // Microsoft Word 97-2003 Document (Word.Document.8) + {0x06, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}, + // Microsoft Word 6.0-7.0 Document (Word.Document.6) + {0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}, + // Microsoft Word Picture (Word.Picture.8) + {0x07, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}, + } + + for _, clsid := range clsids { + if matchOleClsid(raw, clsid) { + return true + } + } + + return false +} + +// Ppt matches a Microsoft PowerPoint 97-2003 file or a PowerPoint 95 presentation. +func Ppt(raw []byte, limit uint32) bool { + // Root CLSID test is the safest way to detect identify OLE, however, the format + // often places the root CLSID at the end of the file. + if matchOleClsid(raw, []byte{ + 0x10, 0x8d, 0x81, 0x64, 0x9b, 0x4f, 0xcf, 0x11, + 0x86, 0xea, 0x00, 0xaa, 0x00, 0xb9, 0x29, 0xe8, + }) || matchOleClsid(raw, []byte{ + 0x70, 0xae, 0x7b, 0xea, 0x3b, 0xfb, 0xcd, 0x11, + 0xa9, 0x03, 0x00, 0xaa, 0x00, 0x51, 0x0e, 0xa3, + }) { + return true + } + + lin := len(raw) + if lin < 520 { + return false + } + pptSubHeaders := [][]byte{ + {0xA0, 0x46, 0x1D, 0xF0}, + {0x00, 0x6E, 0x1E, 0xF0}, + {0x0F, 0x00, 0xE8, 0x03}, + } + for _, h := range pptSubHeaders { + if bytes.HasPrefix(raw[512:], h) { + return true + } + } + + if bytes.HasPrefix(raw[512:], []byte{0xFD, 0xFF, 0xFF, 0xFF}) && + raw[518] == 0x00 && raw[519] == 0x00 { + return true + } + + return lin > 1152 && bytes.Contains(raw[1152:min(4096, lin)], + []byte("P\x00o\x00w\x00e\x00r\x00P\x00o\x00i\x00n\x00t\x00 D\x00o\x00c\x00u\x00m\x00e\x00n\x00t")) +} + +// Xls matches a Microsoft Excel 97-2003 file. +func Xls(raw []byte, limit uint32) bool { + // Root CLSID test is the safest way to detect identify OLE, however, the format + // often places the root CLSID at the end of the file. + if matchOleClsid(raw, []byte{ + 0x10, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + }) || matchOleClsid(raw, []byte{ + 0x20, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + }) { + return true + } + + lin := len(raw) + if lin < 520 { + return false + } + xlsSubHeaders := [][]byte{ + {0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00}, + {0xFD, 0xFF, 0xFF, 0xFF, 0x10}, + {0xFD, 0xFF, 0xFF, 0xFF, 0x1F}, + {0xFD, 0xFF, 0xFF, 0xFF, 0x22}, + {0xFD, 0xFF, 0xFF, 0xFF, 0x23}, + {0xFD, 0xFF, 0xFF, 0xFF, 0x28}, + {0xFD, 0xFF, 0xFF, 0xFF, 0x29}, + } + for _, h := range xlsSubHeaders { + if bytes.HasPrefix(raw[512:], h) { + return true + } + } + + return lin > 1152 && bytes.Contains(raw[1152:min(4096, lin)], + []byte("W\x00k\x00s\x00S\x00S\x00W\x00o\x00r\x00k\x00B\x00o\x00o\x00k")) +} + +// Pub matches a Microsoft Publisher file. +func Pub(raw []byte, limit uint32) bool { + return matchOleClsid(raw, []byte{ + 0x01, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, + }) +} + +// Msg matches a Microsoft Outlook email file. +func Msg(raw []byte, limit uint32) bool { + return matchOleClsid(raw, []byte{ + 0x0B, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, + }) +} + +// Msi matches a Microsoft Windows Installer file. +// http://fileformats.archiveteam.org/wiki/Microsoft_Compound_File +func Msi(raw []byte, limit uint32) bool { + return matchOleClsid(raw, []byte{ + 0x84, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, + }) +} + +// Helper to match by a specific CLSID of a compound file. +// +// http://fileformats.archiveteam.org/wiki/Microsoft_Compound_File +func matchOleClsid(in []byte, clsid []byte) bool { + // Microsoft Compound files v3 have a sector length of 512, while v4 has 4096. + // Change sector offset depending on file version. + // https://www.loc.gov/preservation/digital/formats/fdd/fdd000392.shtml + sectorLength := 512 + if len(in) < sectorLength { + return false + } + if in[26] == 0x04 && in[27] == 0x00 { + sectorLength = 4096 + } + + // SecID of first sector of the directory stream. + firstSecID := int(binary.LittleEndian.Uint32(in[48:52])) + + // Expected offset of CLSID for root storage object. + clsidOffset := sectorLength*(1+firstSecID) + 80 + + if len(in) <= clsidOffset+16 { + return false + } + + return bytes.HasPrefix(in[clsidOffset:], clsid) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ogg.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ogg.go new file mode 100644 index 00000000..bb4cd781 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/ogg.go @@ -0,0 +1,42 @@ +package magic + +import ( + "bytes" +) + +/* + NOTE: + + In May 2003, two Internet RFCs were published relating to the format. + The Ogg bitstream was defined in RFC 3533 (which is classified as + 'informative') and its Internet content type (application/ogg) in RFC + 3534 (which is, as of 2006, a proposed standard protocol). In + September 2008, RFC 3534 was obsoleted by RFC 5334, which added + content types video/ogg, audio/ogg and filename extensions .ogx, .ogv, + .oga, .spx. + + See: + https://tools.ietf.org/html/rfc3533 + https://developer.mozilla.org/en-US/docs/Web/HTTP/Configuring_servers_for_Ogg_media#Serve_media_with_the_correct_MIME_type + https://github.com/file/file/blob/master/magic/Magdir/vorbis +*/ + +// Ogg matches an Ogg file. +func Ogg(raw []byte, limit uint32) bool { + return bytes.HasPrefix(raw, []byte("\x4F\x67\x67\x53\x00")) +} + +// OggAudio matches an audio ogg file. +func OggAudio(raw []byte, limit uint32) bool { + return len(raw) >= 37 && (bytes.HasPrefix(raw[28:], []byte("\x7fFLAC")) || + bytes.HasPrefix(raw[28:], []byte("\x01vorbis")) || + bytes.HasPrefix(raw[28:], []byte("OpusHead")) || + bytes.HasPrefix(raw[28:], []byte("Speex\x20\x20\x20"))) +} + +// OggVideo matches a video ogg file. +func OggVideo(raw []byte, limit uint32) bool { + return len(raw) >= 37 && (bytes.HasPrefix(raw[28:], []byte("\x80theora")) || + bytes.HasPrefix(raw[28:], []byte("fishead\x00")) || + bytes.HasPrefix(raw[28:], []byte("\x01video\x00\x00\x00"))) // OGM video +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/text.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/text.go new file mode 100644 index 00000000..e2a03caf --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/text.go @@ -0,0 +1,375 @@ +package magic + +import ( + "bufio" + "bytes" + "strings" + "time" + + "github.com/gabriel-vasile/mimetype/internal/charset" + "github.com/gabriel-vasile/mimetype/internal/json" +) + +var ( + // HTML matches a Hypertext Markup Language file. + HTML = markup( + []byte(" 0 +} + +// GeoJSON matches a RFC 7946 GeoJSON file. +// +// GeoJSON detection implies searching for key:value pairs like: `"type": "Feature"` +// in the input. +// BUG(gabriel-vasile): The "type" key should be searched for in the root object. +func GeoJSON(raw []byte, limit uint32) bool { + raw = trimLWS(raw) + if len(raw) == 0 { + return false + } + // GeoJSON is always a JSON object, not a JSON array or any other JSON value. + if raw[0] != '{' { + return false + } + + s := []byte(`"type"`) + si, sl := bytes.Index(raw, s), len(s) + + if si == -1 { + return false + } + + // If the "type" string is the suffix of the input, + // there is no need to search for the value of the key. + if si+sl == len(raw) { + return false + } + // Skip the "type" part. + raw = raw[si+sl:] + // Skip any whitespace before the colon. + raw = trimLWS(raw) + // Check for colon. + if len(raw) == 0 || raw[0] != ':' { + return false + } + // Skip any whitespace after the colon. + raw = trimLWS(raw[1:]) + + geoJSONTypes := [][]byte{ + []byte(`"Feature"`), + []byte(`"FeatureCollection"`), + []byte(`"Point"`), + []byte(`"LineString"`), + []byte(`"Polygon"`), + []byte(`"MultiPoint"`), + []byte(`"MultiLineString"`), + []byte(`"MultiPolygon"`), + []byte(`"GeometryCollection"`), + } + for _, t := range geoJSONTypes { + if bytes.HasPrefix(raw, t) { + return true + } + } + + return false +} + +// NdJSON matches a Newline delimited JSON file. All complete lines from raw +// must be valid JSON documents meaning they contain one of the valid JSON data +// types. +func NdJSON(raw []byte, limit uint32) bool { + lCount, hasObjOrArr := 0, false + sc := bufio.NewScanner(dropLastLine(raw, limit)) + for sc.Scan() { + l := sc.Bytes() + // Empty lines are allowed in NDJSON. + if l = trimRWS(trimLWS(l)); len(l) == 0 { + continue + } + _, err := json.Scan(l) + if err != nil { + return false + } + if l[0] == '[' || l[0] == '{' { + hasObjOrArr = true + } + lCount++ + } + + return lCount > 1 && hasObjOrArr +} + +// HAR matches a HAR Spec file. +// Spec: http://www.softwareishard.com/blog/har-12-spec/ +func HAR(raw []byte, limit uint32) bool { + s := []byte(`"log"`) + si, sl := bytes.Index(raw, s), len(s) + + if si == -1 { + return false + } + + // If the "log" string is the suffix of the input, + // there is no need to search for the value of the key. + if si+sl == len(raw) { + return false + } + // Skip the "log" part. + raw = raw[si+sl:] + // Skip any whitespace before the colon. + raw = trimLWS(raw) + // Check for colon. + if len(raw) == 0 || raw[0] != ':' { + return false + } + // Skip any whitespace after the colon. + raw = trimLWS(raw[1:]) + + harJSONTypes := [][]byte{ + []byte(`"version"`), + []byte(`"creator"`), + []byte(`"entries"`), + } + for _, t := range harJSONTypes { + si := bytes.Index(raw, t) + if si > -1 { + return true + } + } + + return false +} + +// Svg matches a SVG file. +func Svg(raw []byte, limit uint32) bool { + return bytes.Contains(raw, []byte(" 00:02:19,376) limits secondLine + // length to exactly 29 characters. + if len(secondLine) != 29 { + return false + } + // Decimal separator of fractional seconds in the timestamps must be a + // comma, not a period. + if strings.Contains(secondLine, ".") { + return false + } + // For Go <1.17, comma is not recognised as a decimal separator by `time.Parse`. + secondLine = strings.ReplaceAll(secondLine, ",", ".") + // Second line must be a time range. + ts := strings.Split(secondLine, " --> ") + if len(ts) != 2 { + return false + } + const layout = "15:04:05.000" + t0, err := time.Parse(layout, ts[0]) + if err != nil { + return false + } + t1, err := time.Parse(layout, ts[1]) + if err != nil { + return false + } + if t0.After(t1) { + return false + } + + // A third line must exist and not be empty. This is the actual subtitle text. + return s.Scan() && len(s.Bytes()) != 0 +} + +// Vtt matches a Web Video Text Tracks (WebVTT) file. See +// https://www.iana.org/assignments/media-types/text/vtt. +func Vtt(raw []byte, limit uint32) bool { + // Prefix match. + prefixes := [][]byte{ + {0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x0A}, // UTF-8 BOM, "WEBVTT" and a line feed + {0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x0D}, // UTF-8 BOM, "WEBVTT" and a carriage return + {0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x20}, // UTF-8 BOM, "WEBVTT" and a space + {0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x09}, // UTF-8 BOM, "WEBVTT" and a horizontal tab + {0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x0A}, // "WEBVTT" and a line feed + {0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x0D}, // "WEBVTT" and a carriage return + {0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x20}, // "WEBVTT" and a space + {0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x09}, // "WEBVTT" and a horizontal tab + } + for _, p := range prefixes { + if bytes.HasPrefix(raw, p) { + return true + } + } + + // Exact match. + return bytes.Equal(raw, []byte{0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54}) || // UTF-8 BOM and "WEBVTT" + bytes.Equal(raw, []byte{0x57, 0x45, 0x42, 0x56, 0x54, 0x54}) // "WEBVTT" +} 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 new file mode 100644 index 00000000..84ed6492 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/text_csv.go @@ -0,0 +1,63 @@ +package magic + +import ( + "bytes" + "encoding/csv" + "errors" + "io" +) + +// Csv matches a comma-separated values file. +func Csv(raw []byte, limit uint32) bool { + return sv(raw, ',', limit) +} + +// Tsv matches a tab-separated values file. +func Tsv(raw []byte, limit uint32) bool { + return sv(raw, '\t', limit) +} + +func sv(in []byte, comma rune, limit uint32) bool { + r := csv.NewReader(dropLastLine(in, limit)) + r.Comma = comma + r.ReuseRecord = true + r.LazyQuotes = true + r.Comment = '#' + + 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. +// +// mimetype limits itself to ReadLimit bytes when performing a detection. +// This means, for file formats like CSV for NDJSON, the last line of the input +// can be an incomplete line. +func dropLastLine(b []byte, cutAt uint32) io.Reader { + if cutAt == 0 { + return bytes.NewReader(b) + } + if uint32(len(b)) >= cutAt { + for i := cutAt - 1; i > 0; i-- { + if b[i] == '\n' { + return bytes.NewReader(b[:i]) + } + } + + // No newline was found between the 0 index and cutAt. + return bytes.NewReader(b[:cutAt]) + } + + return bytes.NewReader(b) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/video.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/video.go new file mode 100644 index 00000000..9caf5553 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/video.go @@ -0,0 +1,85 @@ +package magic + +import ( + "bytes" +) + +var ( + // Flv matches a Flash video file. + Flv = prefix([]byte("\x46\x4C\x56\x01")) + // Asf matches an Advanced Systems Format file. + Asf = prefix([]byte{ + 0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, + 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C, + }) + // Rmvb matches a RealMedia Variable Bitrate file. + Rmvb = prefix([]byte{0x2E, 0x52, 0x4D, 0x46}) +) + +// WebM matches a WebM file. +func WebM(raw []byte, limit uint32) bool { + return isMatroskaFileTypeMatched(raw, "webm") +} + +// Mkv matches a mkv file. +func Mkv(raw []byte, limit uint32) bool { + return isMatroskaFileTypeMatched(raw, "matroska") +} + +// isMatroskaFileTypeMatched is used for webm and mkv file matching. +// It checks for .Eߣ sequence. If the sequence is found, +// then it means it is Matroska media container, including WebM. +// Then it verifies which of the file type it is representing by matching the +// file specific string. +func isMatroskaFileTypeMatched(in []byte, flType string) bool { + if bytes.HasPrefix(in, []byte("\x1A\x45\xDF\xA3")) { + return isFileTypeNamePresent(in, flType) + } + return false +} + +// isFileTypeNamePresent accepts the matroska input data stream and searches +// for the given file type in the stream. Return whether a match is found. +// The logic of search is: find first instance of \x42\x82 and then +// search for given string after n bytes of above instance. +func isFileTypeNamePresent(in []byte, flType string) bool { + ind, maxInd, lenIn := 0, 4096, len(in) + if lenIn < maxInd { // restricting length to 4096 + maxInd = lenIn + } + ind = bytes.Index(in[:maxInd], []byte("\x42\x82")) + if ind > 0 && lenIn > ind+2 { + ind += 2 + + // filetype name will be present exactly + // n bytes after the match of the two bytes "\x42\x82" + n := vintWidth(int(in[ind])) + if lenIn > ind+n { + return bytes.HasPrefix(in[ind+n:], []byte(flType)) + } + } + return false +} + +// vintWidth parses the variable-integer width in matroska containers +func vintWidth(v int) int { + mask, max, num := 128, 8, 1 + for num < max && v&mask == 0 { + mask = mask >> 1 + num++ + } + return num +} + +// Mpeg matches a Moving Picture Experts Group file. +func Mpeg(raw []byte, limit uint32) bool { + return len(raw) > 3 && bytes.HasPrefix(raw, []byte{0x00, 0x00, 0x01}) && + raw[3] >= 0xB0 && raw[3] <= 0xBF +} + +// Avi matches an Audio Video Interleaved file. +func Avi(raw []byte, limit uint32) bool { + return len(raw) > 16 && + bytes.Equal(raw[:4], []byte("RIFF")) && + bytes.Equal(raw[8:16], []byte("AVI LIST")) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/zip.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/zip.go new file mode 100644 index 00000000..dabee947 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/zip.go @@ -0,0 +1,92 @@ +package magic + +import ( + "bytes" + "encoding/binary" + "strings" +) + +var ( + // Odt matches an OpenDocument Text file. + Odt = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.text"), 30) + // Ott matches an OpenDocument Text Template file. + Ott = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.text-template"), 30) + // Ods matches an OpenDocument Spreadsheet file. + Ods = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.spreadsheet"), 30) + // Ots matches an OpenDocument Spreadsheet Template file. + Ots = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.spreadsheet-template"), 30) + // Odp matches an OpenDocument Presentation file. + Odp = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.presentation"), 30) + // Otp matches an OpenDocument Presentation Template file. + Otp = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.presentation-template"), 30) + // Odg matches an OpenDocument Drawing file. + Odg = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.graphics"), 30) + // Otg matches an OpenDocument Drawing Template file. + Otg = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.graphics-template"), 30) + // Odf matches an OpenDocument Formula file. + Odf = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.formula"), 30) + // Odc matches an OpenDocument Chart file. + Odc = offset([]byte("mimetypeapplication/vnd.oasis.opendocument.chart"), 30) + // Epub matches an EPUB file. + Epub = offset([]byte("mimetypeapplication/epub+zip"), 30) + // Sxc matches an OpenOffice Spreadsheet file. + Sxc = offset([]byte("mimetypeapplication/vnd.sun.xml.calc"), 30) +) + +// Zip matches a zip archive. +func Zip(raw []byte, limit uint32) bool { + return len(raw) > 3 && + raw[0] == 0x50 && raw[1] == 0x4B && + (raw[2] == 0x3 || raw[2] == 0x5 || raw[2] == 0x7) && + (raw[3] == 0x4 || raw[3] == 0x6 || raw[3] == 0x8) +} + +// Jar matches a Java archive file. +func Jar(raw []byte, limit uint32) bool { + return zipContains(raw, "META-INF/MANIFEST.MF") +} + +// zipTokenizer holds the source zip file and scanned index. +type zipTokenizer struct { + in []byte + i int // current index +} + +// next returns the next file name from the zip headers. +// https://web.archive.org/web/20191129114319/https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html +func (t *zipTokenizer) next() (fileName string) { + if t.i > len(t.in) { + return + } + in := t.in[t.i:] + // pkSig is the signature of the zip local file header. + pkSig := []byte("PK\003\004") + pkIndex := bytes.Index(in, pkSig) + // 30 is the offset of the file name in the header. + fNameOffset := pkIndex + 30 + // end if signature not found or file name offset outside of file. + if pkIndex == -1 || fNameOffset > len(in) { + return + } + + fNameLen := int(binary.LittleEndian.Uint16(in[pkIndex+26 : pkIndex+28])) + if fNameLen <= 0 || fNameOffset+fNameLen > len(in) { + return + } + t.i += fNameOffset + fNameLen + return string(in[fNameOffset : fNameOffset+fNameLen]) +} + +// zipContains returns true if the zip file headers from in contain any of the paths. +func zipContains(in []byte, paths ...string) bool { + t := zipTokenizer{in: in} + for i, tok := 0, t.next(); tok != ""; i, tok = i+1, t.next() { + for p := range paths { + if strings.HasPrefix(tok, paths[p]) { + return true + } + } + } + + return false +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/mime.go b/vendor/github.com/gabriel-vasile/mimetype/mime.go new file mode 100644 index 00000000..62cb15f5 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/mime.go @@ -0,0 +1,186 @@ +package mimetype + +import ( + "mime" + + "github.com/gabriel-vasile/mimetype/internal/charset" + "github.com/gabriel-vasile/mimetype/internal/magic" +) + +// MIME struct holds information about a file format: the string representation +// of the MIME type, the extension and the parent file format. +type MIME struct { + mime string + aliases []string + extension string + // detector receives the raw input and a limit for the number of bytes it is + // allowed to check. It returns whether the input matches a signature or not. + detector magic.Detector + children []*MIME + parent *MIME +} + +// String returns the string representation of the MIME type, e.g., "application/zip". +func (m *MIME) String() string { + return m.mime +} + +// Extension returns the file extension associated with the MIME type. +// It includes the leading dot, as in ".html". When the file format does not +// have an extension, the empty string is returned. +func (m *MIME) Extension() string { + return m.extension +} + +// Parent returns the parent MIME type from the hierarchy. +// Each MIME type has a non-nil parent, except for the root MIME type. +// +// For example, the application/json and text/html MIME types have text/plain as +// their parent because they are text files who happen to contain JSON or HTML. +// Another example is the ZIP format, which is used as container +// for Microsoft Office files, EPUB files, JAR files, and others. +func (m *MIME) Parent() *MIME { + return m.parent +} + +// Is checks whether this MIME type, or any of its aliases, is equal to the +// expected MIME type. MIME type equality test is done on the "type/subtype" +// section, ignores any optional MIME parameters, ignores any leading and +// trailing whitespace, and is case insensitive. +func (m *MIME) Is(expectedMIME string) bool { + // Parsing is needed because some detected MIME types contain parameters + // that need to be stripped for the comparison. + expectedMIME, _, _ = mime.ParseMediaType(expectedMIME) + found, _, _ := mime.ParseMediaType(m.mime) + + if expectedMIME == found { + return true + } + + for _, alias := range m.aliases { + if alias == expectedMIME { + return true + } + } + + return false +} + +func newMIME( + mime, extension string, + detector magic.Detector, + children ...*MIME) *MIME { + m := &MIME{ + mime: mime, + extension: extension, + detector: detector, + children: children, + } + + for _, c := range children { + c.parent = m + } + + return m +} + +func (m *MIME) alias(aliases ...string) *MIME { + m.aliases = aliases + return m +} + +// match does a depth-first search on the signature tree. It returns the deepest +// successful node for which all the children detection functions fail. +func (m *MIME) match(in []byte, readLimit uint32) *MIME { + for _, c := range m.children { + if c.detector(in, readLimit) { + return c.match(in, readLimit) + } + } + + needsCharset := map[string]func([]byte) string{ + "text/plain": charset.FromPlain, + "text/html": charset.FromHTML, + "text/xml": charset.FromXML, + } + // ps holds optional MIME parameters. + ps := map[string]string{} + if f, ok := needsCharset[m.mime]; ok { + if cset := f(in); cset != "" { + ps["charset"] = cset + } + } + + return m.cloneHierarchy(ps) +} + +// flatten transforms an hierarchy of MIMEs into a slice of MIMEs. +func (m *MIME) flatten() []*MIME { + out := []*MIME{m} + for _, c := range m.children { + out = append(out, c.flatten()...) + } + + return out +} + +// clone creates a new MIME with the provided optional MIME parameters. +func (m *MIME) clone(ps map[string]string) *MIME { + clonedMIME := m.mime + if len(ps) > 0 { + clonedMIME = mime.FormatMediaType(m.mime, ps) + } + + return &MIME{ + mime: clonedMIME, + aliases: m.aliases, + extension: m.extension, + } +} + +// cloneHierarchy creates a clone of m and all its ancestors. The optional MIME +// parameters are set on the last child of the hierarchy. +func (m *MIME) cloneHierarchy(ps map[string]string) *MIME { + ret := m.clone(ps) + lastChild := ret + for p := m.Parent(); p != nil; p = p.Parent() { + pClone := p.clone(nil) + lastChild.parent = pClone + lastChild = pClone + } + + return ret +} + +func (m *MIME) lookup(mime string) *MIME { + for _, n := range append(m.aliases, m.mime) { + if n == mime { + return m + } + } + + for _, c := range m.children { + if m := c.lookup(mime); m != nil { + return m + } + } + return nil +} + +// Extend adds detection for a sub-format. The detector is a function +// returning true when the raw input file satisfies a signature. +// The sub-format will be detected if all the detectors in the parent chain return true. +// The extension should include the leading dot, as in ".html". +func (m *MIME) Extend(detector func(raw []byte, limit uint32) bool, mime, extension string, aliases ...string) { + c := &MIME{ + mime: mime, + extension: extension, + detector: detector, + parent: m, + aliases: aliases, + } + + mu.Lock() + m.children = append([]*MIME{c}, m.children...) + mu.Unlock() +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/mimetype.gif b/vendor/github.com/gabriel-vasile/mimetype/mimetype.gif new file mode 100644 index 0000000000000000000000000000000000000000..5aef641d6605348ae0181959e23b44218b6a1d7f GIT binary patch literal 1343768 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
    &w}F3~$$iOK@;@dqL;B;3Iwi_N6iL91*iC@;pL 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

    bzz}BQ>wj4_;T?H*?flr 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 z

    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

    |e<_ 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

    Cb-Mx#J$ zszFA72%||VbkC$X(PUxYbcWGT(#C9X-|S%D4C6pFW50`pNtCUu1jp8#yUdDB#k`Tx z^2ElP=)f9{!CG?{pOW=QMVLFyxvwj;A51Ib z9X1C2qm^M{n0&h$0=u0;=65aS@4A?SEMt5I|7zvnjYF>xlD}H{;V`7?AFYhV684`~ zt{JSVfo*+XsH)vyt2?NwyI}kBQ1u1MR*zg=kHy|VRNX+u-pEu9ZRBKc5~ywxWB)2! z{Z*B{S+}~`l)c5ay2X|Kn{V~E5cbyS>efW|wv6hweD?OT>h?PJ?=98eyVyGht2-vy zI~S@uH`u!ls=F@OyC15%q3jUk8VD9g4^d4I6-O^qO)n=$pFmBY*#A4Va^3%TwDN;9 z=)b1&=KqJ7GE|T5eOi7+)A#kA{nCcEu=K*X+|u>!{q6nZh|HqZt-awNa|>%*eWO3l zuWphHD^JcZJz_pqG_{{zT-Sc$o=D@OdbSMktt=Dsr*L)C<2XA@oUBOXZbWXlhLo0v*qfa74sCEtLCfq zn;h3io2wVUnD@m}Dz(%sH`&itnT)m6u6}dh9nDkvR=57$|Mp~k?Aw>k?ob4DD&^Mt z?LII*yXkmq!|qTry;8n%TjT!NCtjzG@wTSJAB9qJR4VOXk7p~is!b=_n@<<(t;X_I zzPFsOwtAgzOnm?LA5;F1DgW10{(q#Y{2x>Pk17Ahl>cMO|1stNnDT#2`9G%oA5;F1 zDgXbIDGT1Bpmjhn)*x6f5FCmgJdqv(;~t`*9+KQ1vW^~#wH~VY9++dM{ns(4@KWdY zvUT)wto3rf^m2Ff(!*%-8X==|J994Nbw?j;rbz6i5A@Q*uS_V_LHGvdn@js7I{KB@ z`c+^0$&C9oX$K5E`eSqY;Q#}M9RtQ|10u=;>TrX476VytAsJ!47$P*79D}QlkQs@= zxwrw$nn8^5K^2Q3>9bD%8a!a`fCC2&)ah(+q+v*_W+)s3@PB2WgGGiyjfXx2QAAP@ zy5|xKw(ttKn32r+CNkqBQ28e*_WPcR*%qAdAif_d!D)FNFSna?P?HBSGUeFF)`;$vW+gcXE(k zb4=tYPh7qjVdnM0h^Ns%82VTlXP;w=81pZN7I>MmPMLbo{o}p+4{3`Tr4;CdPS0Nu zy^S#@YBdQ1(PJF$3>Y(3v@;9|Gm<^C3Pm&8(;ky|9?-KPwo79G$6aJ#mz`vg{Q<)s@SRt-e7wl6<#+=R$S_qAn<#PvulX+vd zR{n+2vHuH}@sj8uxMVo#0m82wKO7{MUH_5M z$1oWU0lLF&S{$#n8AFIT@to#)4~FKe^Ok0Zg8e^+z}1IbT!M?KT7>HY)z* z(L}@q`B^Mj)KjnCTZ=A)#Ba5TdbQ@Ed{5x*6y5( zN1xmFZ)3M_R*%p`55{HRz30TiQAN$_I`*8LDs*ja;9T)@J!Hx~EbTfhr}9Ifw2u%_ zdIQ4ArUK+bm+KRE{n<}mlup=PPh=xcjxhl(AO7Z^KW-t|Ot}n*5#?`WG;P%D1)oOL z>^N@k9i1%*BcK18c-ALc{g+D1nEVeatv!nn5;R8emr57Is5InJwCLyC zSI?~y&kxSeVo(p*8~6EALco+*0GztLuO80oxc$bO%%9H5WNFm&Lz&NzCt-0C+)L`< z?oWr8--K1~LDLQeM1Ufu-zRzNhjk~_F#GJc(j=e(cufNVp#v~7NJt=&5}F7mkK800 zJJPX)uT1+tHCRd}{7usTgHOVV!3Unw}U3ysFoN{GgtAD!h=wijPhMOsI?AcfvSl(kQ4>%F5&riG@fj zEevhk>)}OBzT)i2XT2-)QdT!StV(`R1Uyf+U;v)L_FkAehGb!`5C{LPyoPE0ct{H3FYQR zWzu)2+d*@FElXWApO8{3FfL@`Qt(b-uQ(((H0t-*lqbvNZk1G_zK4^N7R~$)4SWSwtS-aoA zgfkT3I3AdI&N0uT1{^9L?f~q7J*Q)q&>^C+Tj-#!NnRoXjhD7oK?3W9 zxS=&+C^sISmFii0s^>!7AdM9b&nUQg6)es2Iu!Q;F*FhvxeD|~SHj(CP*o>Nz%1B_ z&CBflA4*gmJ5-9tHb=N*`XV9oeO*1bS8Ps&O`|@7#VyEzO2w@QWEnJMj;(?Kat;f!%@$@Sshu`6c$2M}R9=>}~3jGxE zey_EkZ5MF@@wFQqB6@Z=WQJd)^~ASZrSV2NfuoBEI)XFBb>E<+#fF2)>uv@|8ydZ5 zB2h<(l3CuP9`+9mg#@E+ZrW29nM;oWKbOnSNAm$ban(0mtpWEQh{3@>#TnNjH0SR4 zsvX#a`0sj{+YzP!h?G)TAyY_iwj?w*bL4TLcyy7p?&d&hd2put1HvC02p2mL!fyUL zlp@j`Da$g$XXR%Xxu{x5IQa}HR=SfuOzyohJm6zZNz2N>l>%YUjAaX7GUqzbkpZzd zUY10fj*}$>VboNTBE5KgZ#$G!0qFClQ{^IZCn(#O4L!;%OoR%%}LV z{F8yRdi}gvI5FW~^PtvUVKUAOAG`*_x(+=l(a3sSXDWhZer&CreE!AP0Jw%PK{();K@SGC=9@8UV`iz62?2 za6(KONm0($*+wyRNkXdG;I!OB=~(*dw#kH=lssh5UHb2`5ntxdY`r@UI6gC{G$GNr zJf(wI;Q`;k!!9(6eRk{cQQwGuU*%!Tq`jpT*7#hJR(!;FD3gZw<47Cb2VrD^*Mwx^ zw+w?XoO{oi=R*4`5{)13cHU(uvxxhSbTQe$u^dmfR(^DUv8c?RYS=S=qNH8OJ-K|Y zw%=^7uK&=yKL_i89+x2|m3pc*lRJ`i6eE*|jSp#{{gK`8_WF z!mr`LjNtnq$Ov=D>btdgmL-K=wRc{Qm@O_@G`ikTK9MH$FARmlkW$d%m4*k zxi7D-o)L4+@i;&AL`hsle0gVzr0}Tq)Lj3I0(Pcy`P3(IedUe%vVCO!sh=|ODyAsM zl2D4d{|BW<+(#=*D5+NF0Ke^CoCgO!CG(rXx3U-sVIrI4*ll1@fg6Qnku_>&AvQ_h zo30EB8+DbeQ5II7n4BP+&!DWavc{XtX+TOn2ujvygmA zlvzcOCnpV>^(eh!ReGP@3J?dGm3tJbERTFG*WpddP9K=q+M{OmTvx{MMJ+9@D^9FprYw>R6}XWo4J;1&}1`A^Wv z&){d~u8{j?v!7@0TYs&h{8{NP*uMU-`C`S@9Xb0xkwDxRm`^WP*s&@?dF5CrxDU1i56KeR?DdG^`xHT1FoH%Deq1`Pp@ATCSu+j=H4swA|ZFz{}sKTY$+nLBHXY-x?2&9 zv(v9;J@7rQkL58kvH}1nG(eahCeMvX;yhpy|6TBF)W~CTY$3kGjf5$m?6s9NZ%^n5 zNn{+!U@F_7Rl00rPA?31N75i-yAQh14vOUtx_Nh7kK>B&;W7ls+LAHLBM$l0aC!9O zdLrU_?aA8T$@+ekE7Ka97#(`I2O~Xl(a_bQ5CZw&m!T;1;jovE9j)OgjMieS;SZ7W z+fwqJal^4+hh4pfW6&LAn56bcD~5Ih4%$dE7zcBP z8*@%Q0ec%47Y?voh`9>ETpz9mz_QV;Qr5zXcrPPGceTxTV&6n!DEq4^tK!So6tyuz zD-lC68|Z2gadByJ@hb`1F+vF)=v(`F`>mD6G?nk2##7AkOH$*0Efc+M0C%n6M`we@ zQ`jV56TmjmaCs2Orw}LxRNYLcL;IAKLW9N!`YVe$Iu?}U>)MEtdwW09v3m1Wx}%1A zRMIagX8Obc{lbU?Vn_pfNO;30bi7q4j3&ENRFW$)vfy&woyabR(*>TDzwez`ga?Gt zu|$BfBMh@6-Lr$@R1cMZ90XMyQhd2T14q#20=RQeIckVk${jp&H`Bq+l8kNj6kQss zkLhCYHfr%aQ$HKqBc`#0=#)=;Cd+c;&xMkVuP4Ru3e0H>esLGTnW#i4Pa&ub;kXQ8 z6DCF|6an;$Si+}%jjK%5Q;{}Kk)=+vkKnbR(av)S{Un$k(^A5hiH}I>7iv`N>QyV_ z0gGf$-vbNGNU60c7$_N`LR9C|CI~YcM(RBZpThJ>>Miq#Wi$bWOim}0WH)MyD`o9R zWs#3eU)MD7YGz~xxffCKx8p~)HC%2pP(S4xJ-f; zUA9(b5M@NJ3`~x@X6c2uX_1Y zLPi$jaL#;dZu9Gcd4oSY27K&>qzH!93M)lAjh{;e%XJz`qqHk*R_sy?ABzlMjTt%; zu2h{@R)3r+L|6r{8-6kQR#!UQXrldfzPW*a^{b`PM{Of?FC)R6)o(ICT2+)g6I$CT z^S%$PYVWTy+^!-ctYuNGK};I@DI0rL+WJfkhINb`t=6j2)?#bd{5sc0qRJ;qS%&7h ze*~|L@2^1vI}~PQ1gD~i=3kjCl&+;kt}pEi_`F&_^E9DPU0<6w3AfUpt6itZUyoT| z-)7uMIa}W(Y}g_++AnQi)iFNAe6y(|dNg2kLdbjSVss#5N_1f?H9l3?*!dHGKLSO;&85J`}AA6 z2wPlATY@I$XK&4eg0|qJg`mM5$W&&ivTHvR%uAZganH@Mewp{Kn_~zx;byeqFe&0Q zSrme{btrp?OqEGg4bX^0NvRacTe^vLw+XS9DP4squ*}I0EK2V!G7xs)33q7oR~S?~ z=o6tUbh?&VHn7U7B})DdOUo)dvNX#<8=I^=m##YJh7dQAJP)S^<$@(gm%!@`kbtcD z8{OS96{{XztM;f}LEp}|$Zf*D79wKoVo**{zJ)l{N|e(;O3Xr<$+~rZOQ=jj#?-nf zbT1x%53$0B$C^8LPrfW$^#PM`DsF)dp*6x%Su;xvb9@DUwYd-HNAIcYb5ZqLPGKS*)JbaBWccJ#%>KE~;YCf+_p$(}9bh&KOdvBMrb zW>0!%Z!KUK>}ueC0ZGC-jJ+60;IvIKHBLPMrExlZY!Ue6s+4YfESq}l@Y&&A%W=+u zX~>0x@T3FkhJ!cNNhJFTQ28W7%%Q;b%V*W*Qd#@*7K6+#P^B)YrtYMy%&`dZB>BQo zD9TZ5)-e|A)c(b>PRywR%hB4|shj=uPn^@&kmCl~jWz)jVE^ew^Qpq>Y0R_J6Rg4= z>}1G!)?8Q7WxCn7@x8}ZdI zTbHZ5;Hv@Et4rjovd?a41y^bNr)VhO(d|UBsSWNX-SzjcN)bHbUtQz6l@o}!<9|>k z((`z0Ey{`c2mu{!9L_U5qiOKc*Fkff)nL--RFXv`F3snhDXjT<>iLY?lytqR^Y>JoXD+U z`E8W(t?!``o_tFvG|u8frDE{6mRAq!=mChh5KGob~m8+vl55bQsp-?C|xXE zH}Y=YvSy~zZr+mL?mA|@0p8xxQQk6{-WOs%o4>pnhwfAg?z9&#H0*5EGVkFct|h?#)p;(P#786ilmeWR0T(>Lb>79LPOO6NK2rfVI*Nb zZa>5Pe@?mjXncEkz3`y^K%wvc6Z{zForDBF8pMuG2CMsr+WCJl^TT-KQ=>3C=pR2^ z5ByS-usVzxS1~&CcguD{u%2Jc<4*w4|A@msFV5E%D{qf=T(LKb0}h7T;Mh>3$hQC* zf(Xc;6mv5Hd52FERF9P@W4!TT$ap+{5wMGbBcj6pQ}<(-|Kn2bQ-;Ccr=kW70FieO zcnfC{49K|j%QW*ZAn>huf>VP~k}buB!Fp{ke#D`18p+_cFTcKH19S);6S}j9OXf$? z!E6|zaxv)&q~IPzz~r9J50P}~*T53J=K(+fH2!yB#&Qo;jo!4{yNRv%nxv=b!{_*) zLDtxL#_~WDme8;zBwyOWXb|f{0dR>LxLh9W%lh);Po`s~isHF;h#m0`fzG-h>t+WK z;>Y@3ZQzm!x~vs+xPcAWL;(Z7%L7>KuV{KB(TI7R|6$4ic*JD;zf2jIRd?>_ zntnJALC}!96}+1fPS2Xb;h$wf7^OArl`|=i_d=mIDWCi6de4+*f&_Di@~|*bY{lX3tljqCaPc zV+lrs1k;Km!c_$80^}ny=K<9qvp7Yk7nMYU7=YnHhtqS^#c*gziU z`*UbTRj%jH{AWve24flMy;T)8dBmEbsh{YG!hvpH<0eM;d%G%W>~4WiG~|gcXpMzS zl11pT7-(HZ`ZUD`iS{|)N>!jNx3`J~2=@KcxON%H>spaqykC3!Vu-7goVvtA;m`!P z-XoCl%UK2=F;PqL7g`RwiBU!t>Y$N*(hVdINiT|~ZqQ36qbSu-M<5s|OvWJK2NlQQ z;mW0WP!^+P#glpHTggJtItf6^!o`SWGW@RysAP7x1$R>v*xE|ek$4<5fPw0Wh;msJ zceGMWCB;2PIh;7N{S*=L|mN`L1aY$Vn4;T3ck37G>E<*xa;j z=>n#bQRpZb@yrS%h!m%bej+VT#liJImgntIX|cJ}w9`jV+}pI2j;LhC@V#m=h2l;CzBpS4jETC?M^W-LmnVqk{)u zNceSz>`o6L$!5(g)Ts059tmq??phiXqyV zm1l&BIkL6|NchefFyfh;JjA;i#4F36BP5GK(3#8)uyl`vEB2xMDhc=k;Q?XM)_?#q zcsFOfQ<7TJe3Qsw6!nv8A^IqCmLv?4NJ3BM$=IUm+7dNZ$r35(Hhk%BfL|@|ycXqL z^A5i=^B&=hp_}Ah4;rXhS8m6!i;?eaPWDbyBJU@|ttBXOn*v9m9+EUiv%?c_-JRf%*_XBi~NA)y4 zGg{IyIoz^X4dB6?qiNFj+t~zX%ad&KBSv(EAi{aPra#O7HbOlv7lZJhXg6Y z&reQZfc2G*Vk=V3*(DdX10G#Y80LL5+syYOoWD0;RxCKYD zPA3CY2Ovg&{GO!4u$A=`e7IWv0gED;yt+=ip3*)%_?^8(5Qkub5IohFFYOS|Rf~ zP}g3D5I~K2EUy$eBjPDt%HdO~B4IF_r}S@4#bRX;(2jSK~L0? zCl31Xzp-~$L2<_Wy60cqp>c=C-CcuQa1AcOEszjA!QI{6T|x-%?gV!U?mCHe`_{jHpXVC@k}(HNe!voWFK`E``_qst14#TcFtJ8=4TL?w zJZwBn?bo;UDH<#;pm4@wocBd`Y%Ef#kwRqze3e=usX7f~*fl4U&3b1QYBjrR{-}8B z9h0`Mal-Rqh*X8RHAk`yr)xp$I>oen74PA;mr^rt>MuShTT~E+)_=zjPTDv5K)lNz z887J!@h>`CCJ=-jO*Dgd5MlB$nJ3H=CXAgyh_oO^OCJ|!XrzMYEMy&zpU~X%$i8E> zm92{Zs=3!xVaz6LFg}ym!QcD|gH?p`8Fw8KT<+U>VdQsXIMIL)^u^?R;@TTk8ql>0 zsG`3!f8M0ykr@J05e38g*AGJoyR~&k1{gIP*e!?vv?7Im%s|+1<5qYwF3ESK&qjO# z2huks;mftYo$TMRfhPw6VCNZCsgW8nIh3$( z2k>n9l!sAM)W~NsSE&2Bdh$&a)Ag=PW5(#RTVq(Y2Vvx%)u8v{EfO(KHGp0~uQIOgfGigiP5v!5JK#L5=OuoWT@mt%;^9 z?Oa-y&Czivyd^X}uBwm+cXb#DFAU&I)K?%+I%&i934} zCRJi*6cQkwBFvy=IE6M#GJ~6DpEH?+8*4*|RXGbBT zV9UzQzlnW*njI@qSb$M41hQ@SU~I6LG>Qv14E7P)t30DGW8Rz|ivZ6<5T`{k$X&(j zobAmBg(mzdmtaA%-N+C&Sw<6ERq~&Vuf7TnzhU>VUh-P}y!krq<;S-`@%mDa`{UPR z6~~zB3YE#+n_;ex@qu%rrxS}J*%YeovE^onTsk5w=5++Dl45{nm`D$CcUSeB&eJ+; z_sc;FfBe~vvvVEYotVTo)895vV9VMzFk&BqyDN5FBL%k^Vjm}Xyl#XVO=^wsokL{W zzf=GIAVs^yl9CjR$j8`1=|}m^arNQHJ2l-|`R>~zdE^uQypvhuQ}VomSxUK? z-0*6OTOmrgMe^lGifMA0D>|7-^es4&t$WukAF6y=P;{@t$^?_iBqStvj!tIkoNVtr zV;aU-QZ)Lr#tH^22-7GvXw-zmYa1yruhuuWWisaxCF;0@vd)s^sUi5OcMB0G7gI^* za3>EdF>msFUN*e{Z}LklE|P5qh~O!p}W7LS;Xd!wV+Qal%7eC5d+I| zA_|r2SzNuA6rFKFu#jW~H4#a|fCAh*%4ed#C(#i^23QTQ@azh50G-=OX72`EqNIULb!pF%k?(QUIVTVHSjsZRBjFHBFR1DKoD$%2pGfCS?$iNQ07adH3M;+$J8 z1NwP^4+$7o&c;_*)@RYCW`^M-d&oQL;SU#w8UA$sh$DWOw&uj;V#hX)w+w-SG68J~ zf&8}WqUFJn79nl8AyP*n2l@WawoaDiVUSg=@FARVScIThMqe+QNM`wnT1J)Dask;R zt7gWJU(4mQ8Ke0#q7N8Lmu-D_%PoJD`=HuQfsWsiFvYbYCQ>lO3(FtT4IHt(s4%SadP1?Qw$SPTSaCnTGr5UYMX4% zHDh+}Xm+Jt?$Ghuvx}{VC%Ip_wkCbWeRbJ`S%3LALSVhlN$<17?WF0nil6S&P zg`e`jW6Fr96zu=blv&CR{);KI99*4{dHstiOTGM*`%k9afSTI=hbcRB1pbd^%8>s# zOgXjgF_+_KY2D9Sj;H3jr!J1?p}OZOj$ey)zcx7_2X&AOj^Fonzabm|Qaymh2}4*9 zL&*utP!G$&2`5kw_kt5%z8+qU6G5*Y!ITrxrXKMPClbV?9?6drIjkNzjuR!V9wm`fxq^G$+PVJ;oL%=3zbNB`4NHJ=Skd5K;pOiwm2u0h^KwhoJ$7 zg9}%n0rv$Lo_qtI8W+A^1HLI2flUL!8!keR20}kBqOb;{I4$q9IG_rJavko`1 zPII#@HL`7SvmZ9HUvhIiG;;jr=0y6$iN(W3_=$mwl82k&6E_DBkH9CM7d*W3pLo@H z`1C&Uney=4eByt@BjE9A?LQG~=xAtQ+~~~w*0;lylA45q%JzY=)64IvB{j`GgWnEM zEd64x?;d;;vh9N6--IOvrRL{WeHxtjTG74EXt*8Y+CmCcj$tEq*R-qESL)}Hs#&^`JUr_iL9 zzTx@R&484=uAzzR+lQs~?dgS;-GgJ#m<-2|#O9u%oIig$`yU-}~8rbU3A2 zSI6Vc(Oi}3bXVuo!_~L(JhkqwUr#@7PPeAJyMO-%5E-}q;R$TF1CZ&}EQP{!SG+Em-!2*%R#-ALBvqunUZA;xdfyoe!QP%7Rq#x zZkcL#kYQU|aggcQe0-4QGQ@P4?Y3xlnB#d+ahU6Se|(tdkH~zKA536>R1i*Ic~lt9 ze{xh5FUR~J9sVC3{{M*%FQj)6o=YIE2$Tyb25gv#!r>Cr<)J6a;HZHN9F*%pKr}JY z8;^$4?{Ihy(Ddda+0&j;kitbYLx3}fnKEzz5pGAr!2XF?+kx~Dfz)*PZxlsK!>Xx> z$#^>}F)~c}po{;tXUz>aqZ}m41I$kRqi6l|D^E{$IH!}$L^+X`4Rbn-q^06`;4)6y znd3eSY3ro1H(T}=WCC5BhI@)61@~{;ni|@+W=u?2?Vy!pfTpdD8w=XzX*q;4)Mn3c zspHyhBOs5-Qk(e^f+LdTu88u1M?f6lLZgWGRx^86BWoQmN`R%3I7XPZs1w}^rrW(I zn;07q86n0>T^^wLVFngIg29)S(9R~tuTa{j)-tzOgIP{4O=xA7c2UyE!JK9Zf$zcc zcab7NrbQOQ?E?vN24n59X240ZOwEt!e%VE@)lNAQdl$JdW&570=9@#5;7M{ltUt04 zi=bF95dVo5Bm>W&4vR+8153vm zfPyRusj=5THCWc=Puf^7wtmsS66~ofSD>S2?IDt}NgZrE{HyqF+CL)J6Tj>)-Ci0^ z5j}uM2HD-djBi|cKeUgf)LxexZe*gm(+;(>2L)#3?xa3&oeUm%!GKH=8VJQMKD>E- z;xqSnO(^*QJ-oeZPyg+_(0#M7?hl;?zY_k@3yQ4|jw@w>gCpq8`!y3dKDUkH^P?Y( z>H3Z(+bq8L%K*tLrEm?k}`@hq@mS{Ay$-($ME!KYx?}aES^jkULH9benOg598L)y@- ztZV49FOH_YIT|K@g#@Z19OEW`VdxMsA@7HH_IN%(utx&9kQ3nWg+agVI78Q4?jsy> z0T;9Gpx}zlnk%j9#PW|sP}OYbcsntMVn|O7_&elr4>U@;^Ggj$AZ8~Npid8-OVl38 zsKH4@YVVo8N?=qhjDM8rZPso>;XWfJH3UXdn`UMK#f7=2>x!+hN*js*kiK0+Ot_iAK%{CJ^$B$g z=zy_-?nZun-KylZsd+#%f5+t2sb>*%zf`l^n)#v2wE*52L+EADtjFSQM`-3TT!uBD zqRDjN$VSGDkdAVd3kBHM=oIDMMCa7nx`zV8kPiE@#b4#;8W_2 zoA3136_0EOv5W<$LyyeUvCm&$Ze<4y>CpC zaBnMdeid!7ZRQcBBD&QJbn(4-JERA>gM$&Af>-qkA|l&?wX*|EASW8}iNcH@Jp_(T z>3q%M{G>t|BFsNLrtf5fmQ6 z6G?}+Q|5|9wJ+FOc!WpdRq*UR&ud1I^1s!!wPZsZQVgmV z4C?lSF69jbUmK{u^5^6Zio*#y(+$B&3|YkvfmjNJ1bpFvn|;|o6i##)9>D8MqUXEz zEsO&;Joc+vqM)bPTzHP4JG!m+w}rqcx$xq?2)w)SBqF=2iI+k&8hQreRUNWl=eT-eW`&dgbPQo)M+#?;07ID@UTnZ9mp6M^i{e zEt^O6+D2FO=`<`ywb{nhdd3vlMr=z*2l2%eP{#%-#MX~Q-zr2{mc`!h#7rT_mczy! zgvac^id$W#TK6RX*%EVs%)Ia_4(UD)<}vR0hv=97Sk}Ubn8x_SWzgtIbk9-rk5`mP zit#9qOhm^#-OG_i3kk@r!mKNa?D|3k84xg6D>BckXRt;xzO$<{o{h_ET)uqKMf394QxuO5>$6~TsfjM{c_*cmAnLa7yV zDXAT6kP6Uo*8M9-yEKgpusK*Z{qa8h%{ef4!;bF zpp5iL6pIiPjxb_|xK@S)A(o_L`jiNUG!&MMR{AV`h8)F^4=c8kUe-lIYVJ$K&R`t% zqMuYu92ZKNZGAUa!8%<*x1>nF0vTmm^P<}zrr%=9tnp&nd8FG{%w5oDJY1nWjmSRE zNWE0d`c}bqjzV`Ak@MY-_2HQIDT3}73e)daS{MU5IPZinx8Z*nY3(?`An+}9Nx4% zKN2oh(yvzqZUezvB>`PVNl9^X`dCRLj8qeOJI_^Uh=|TVHHVZ z<@EOHnVIy7Kg06c!n03OiYhb9#xnCC%W@4WB~B^>(kpiut5y}OQthfraVmF*D`O+7 zwvVf_QL2jyt29TdE~Tm?Y^yHQ-E2mLi7NL4MYam(*=| zmjZ_Mh=zQyFDos)!MAPX7>3?Y%xTvKq*z(x_)%1Z?Zm{SgrtV#n2xv&j z>CmVc42^JKk}{n_$k;@pSjNdYdw9cdn$1Pp%uaLiPYcV&$>0>*s!y9r zU$(vrYz=H^t1)axcxv;``eH^LCxO;Jc+ei7(ZUlw2$_zmq?V5p_-6Hw0q+eUr4KuldPXxw4c|gpFF#dY^|@qq3>4}8HZ!P z1lfR;=zt7*uOK?1yf2}sC|Hrz6h?hOoorB3bdYO(fVQf?uVEl*ycZA!!#WN+!VEDw zc5a{c3)1wMko8zp6F6k|yNkqHMR%%^_1K~JI7Jh9JQEmn;2V^_FkXBCkt1;XlfkZc z6D_ha{hPt|67{xa1)D|>w$6^|Jr8xD5d<~!gy>ol4ftLn0YPLyNVSKe^@vE2Ej#O| z!S{Y+^iliju`iON=E_5+e~Z}7snUvsegur50@1PDY*4GU5@Yh%$?0bs<>6Y#;rg?d z$#qg6U;K3_2#0Zog7CLL-1DBtU%m>RL<05*0QArJjiRw}WZ(qfi35!(N9A#2*AE^| zF3wAn`N|`=)sxUD_Rz%OZ^Pl=<5T7^GoEKtM&>>!3qe1WLF*IVo1*W+Z}DNzBM;HR z$JyQREUm;V_-Ti#8EKQH>pVT8HckQ)fm1cbQ(;J+bon58)8C4a>wgI=d+BmlyoquROR%jO3# zY8S?^OpFgD{nkfRSZv! z*q$Sy$Ak<>?hgWAqu*R({5Y!IHOOeZYUR2mRs`gpy9x4m$=33iI}<3HRKLvK_1^4< z6xU3MeSB-g_6LEZd;n4Z6M-LExgL&Y9$I%n$?mrR?EO-){ViY62MhqBf)denWHB|7 zd_gX+La;qad6V;1lzrd7b{(wh_XS$ZE;xeeIf`dHNvvtN$(>~tJ@GR?c8ERBo7hAN z2>8>>R{zt>=CwI}y>m2)daN=P-#Im{kFn8L3li`Q{nN|-c4h%{KFfSQPjT#fu`crQ z-1e^n2iNY4ybA@){!nm-e^Kz}g`?M-8(pdtWmBCnTZBETe>8ZmIPtDY&EC}Mf%x%a zECDSTd5IS0fq@t!uf|IJ9CV5QT?IR{-c*eOf{%ptSA$3PXps0t; zDBRJ-kC(Yi9ofeSFsDm$0cDT{nfYfY!+F^w@~I>llsl*f2jg{ipLD-@Q2IEVlJk&V z_vW_LcNh!ctbK;x*_sdYd#~pL&1R#1`B44f0t0d_R`-*CkGD~G@wZ_eh=4&Mldira z6^cPF9{f)nj`^I#^%{sJ6#EEI{HI|}r(&>2w7vJwhV>_NrC?sH)#PJW2_-ayxngY^ z7lz?nG_m4mGZ$O`LZqx>qq!@_;bH{xVss4`djLtw3sbpQW3Y!t;pOZI6ON5Rv(rZ5 zUOCq{!>E^Vyo}(Yh$IFjEy(_#7IsevoD5(_Sic>p5$GGw9ioKKqK5;39e;4_2B6@v zLd<6T1A>s!P?+h}dwO8t-6Y3;eOkP8T>b3So&3S@!FjWj>3{&4%-?0}WfrPsQe%wX zq%*p6jkm!&;1G7pg>@U$CP_eMNaog?0Q0W&Pq(|rbx=Y}3!*BNGL(3kNq)RF{DO<_ z?D=Ea>sATjNuqJbwtk$f*oJ^cMi3_jCr>=h6p)_}+s~XYA<<8pp5Gm8Ml&UiEl-Qh zo}whfC5x{TUEhT(##;;K(^LxT=&Pi$Z4bnILK{XDjFc29M*qp>55`CgC_;36K1Cox zEd)^e>%qPKAiaUFHNWyDqs&^QBjmx}ef~o_AouWRc_o zzVT<&f>YRVX@$y`8%)vf>B`U!H+m%uJ`bu^&zL;N{z3^G-$|o(K%aslx@H7UiW){7 zi!D00Ahg46smG=Oj|N9Xr2_462NaFec4Fl-bl%R?{umS z7Shb5(Jo3BYZeWLVungPxNztED#0;kc`mGyg3utidKfBPO%1vd9XGxu;~2lFsFygW zB|D2iDUq~kh#cQaK98o9H1kIUVJbR2R4J+wBxQCgI^2;Ihs_v22;wR@FNnVFD2z9T z@J0ObcKBX0wiL0XCAL9EQ7RHUk#z>z*Iw%nZ(0bD1h5JN@EbV!g`Ef=pI*HR__)i+ zSn*5jalbW#4tX1Z-%K+Iq)_$DuW4%|t^VY-Xlwf!dK~3CM9DyM9G&9c9&7P5_$1VR z>U6&X7{xcg3B+hjEu!!x8VRH5!0+87*YpMf{EQM&`MQE{5u8RAAn$9N%P1IyVpFr8 zY(v`?3F<>L>*&MPshiDB+U)c(A%75men&^iB`4B@_s(%@VSU{x z=pvlQUugIr-R;+Edq}9%bX1|+Js|P;M23trr0?T^0Yn$%uh(M%2qE{P;-yqU{MCH* zPc|q65kvzf!fE)JDa>4GTkiR6z_P+Pi{bFaLA1y0^}FFo_1d*)i|U#LP3D+7GUC|Z zk2rv@@#fe0FAfnJIHir^DR^;3a4zEfmSCf?W9wN1K~!|IKo2b6H-A7U-beUM2T?#l zAi&q&Q|)yg?vg;fR>_!^YH;o?s+8F2BPY<9xpPmCBqzR$6!rmr?}I0DQ8!?Y<-H^A z;BE<~q=H8#n@463Azq3%8E0o?@)Biz_Qt1f6^6zDbN#4lXDp2} zdN~DUn`RPGatX)&GDX-o^>oCqC47Sz93L1oEOR)N$%t_e1eFGZd(>2k^7DRO$;-Tk z&G#dFGzE}G5@0EA{K*u}BH<&oYL)g%jS;G5Iuz&XSFft9=oDpqY{6hD9L^ZLa1mm~ zcvi+)PDTWYd3YQMJR?LlQU*U9Uno!(&k4UKjBP|8dt4`kT{kT9{h92%(nvB9PC_K_ zu3^Rr&5L-}8$5k;pNxhd;KxW0HhVlw1Po$}4tyZFGe>F1YUJ~=U=7)XOTDWrR zmuQ}|H^eV>cjO36xY;gt-Luw1ex$a_pk2Is^U~-z^{!8^#g-4(lH`ZwvHrjmOIlUjL<|+*L#2kB?7jR_Z;(INyclWzcI=odyfP*V-)1t=oIyA zxdhG_dtq{&(oSf_hAT9VJGHIau1vTb>@h+5?K%Uhg80Ty$3d9yGX6HKSEf9M{?V}h z7Y;X8*=v6EdBg9v2g*5WVsGnlrEn|$)3DZC{hBu9ma{T(lq#G#cd^=3ApPN$g3aoD zncVwIolbkkkeWcR~N1wT<)#hqD_6ajgHv;n=G#5qf`dxch#NYwRB!E^s;| zDgGCS9~J%>)%kgzV3IQ&U!n!=+E zio+8!pEmBGIDC%b@&l6ZHbP!%H`XQ;hl?tp=6Mc5aX5je{ZapZsf+(yUXvIC~O@ipk$okVaTZLWaiqX6dO7pyYp>$w+NOwMh_H~+Sf>dn2)X&B~QJI1KwSMlOQ4-tLh2hvFBSBPq;nchX zJjw&g&mGb-2~ZZE3}xY-GDJ!!sBJPTGP0B3WN;z^)f6I7)8jPI3jj`7;&6Cr!Cq*w z+87!^Z3^j5FAU;L@@SJb;T`&HD2@IjN>U-*+%50N*TL7xLveF|aCkBlhuaQmQVnTA zarm<^TX8>f1*Xj&*u_A`MSJ*n)X+1LJRFm}v+t16z`*;aVTgnLyO&TLK76?<&jcC& zgTwuwhF6$J0&Y7tpg4R&Anz{@UzZ;F2M)LY2M#}Lj+p<8!;Alk!;Nl6SVR<>tA>%# zN2m-(lLy+Z}m0&Pl(XCuz@Myuri{@ZtVs!sz>OsJB ztR{OfIb8`bi>Ldl1eXzy+6t1+c!^no*VM%HMSDDxTX{%wtnNo*-Y)7L6FzT1CJw4U zzap}rP^EBdk|+}!<71Kpak3OP^O=5fpNuku$Z%pHxO|>fV#zYxn~EToGd1$3GNUN6 zO+e~Q1t|kFx#KK>^LGLlYywxwbkEb#07I2UJlf^px}m-Nc)QH^Cqpfb6B7XpsT%aJ z8_R&6vVii84}HWrl2fQ|st0bJd(XT_&vY#)Kx@TRN842J3~AT#WRyL<>Mm*$N|cC{ z%AHZqjf`5Lfhq;Adhj;c4hpcF(2L!u%9n{rCX{lvtg0J9p;wWs&NX?*I33F}1G5o> z#YS>(Nq~h4fb7+yxJ&Wyk@4&)Ucc3#)xgnAF8Iw0HE$ZXI2yA3vn$(VJO=7(^V9e_ z!~2pcgrC)gsF8)KWknk`u*7D_N+9xkQJVT>;by4*=8vP^J-JOSkLsm&isf<>fe`0ZZ*oU!X*{M zB{--8)RV0m&5s4oh~Oh{Jdngl?3wH6h8JeG3|6dkqoPq*J3Mi z#rlWs`mQfmGIct#5tQ=xN2Bjno=;YWuvf3v^ld~|3-KF+91H-%RjVk2vW2)}gsRGY zni`$Piq8gv1FN;WtHY>kp?9lwA1WHi=Nofg6w0olSsK=h8HQ*X2Ij1NA+Ku*sc2)< zX6!WVP*G$4Wmvvon1o=|LcUJ^Z4J%9D2i>ppDtm@_|x!*$pI&x(GVkC-1Vfr^{Ep6 zFO%yQCF^0=>yWQ}8>Vm@Gb-#8ImvVHHVZBkOTSva}**>`hpZ8P)NW?1KD z5!zM)+g2R8X_3fQgt6&@@>Ze4mVeAv`nkzmmZ?RjDfYN2{n{4)`Bs5W@9#+s81e3( zhQIr4|Ku^)~ZMZi=@HZ1KDQoyxVuLw+}un0~^+@x9lx@OX^YrqayFT-s^Bpqh2=e=3N>vkT#N8y&ZidxP zFz+tSM@SldsT^Z!EA4?ivm7T=tPo4HJR89V-GwN-t~{rSF{`@}7etPybOWG&%>Y5> zg|G=M&hlBm9!>lf74(`k_ghx=H;nafN$syqo?j>4SxlkrX|q}m3-7T|?1^G#$}E19 z9TJsSl~KerQ0Nj>nvzy#9}{<1d}(bNGrL#4zn2KrVXRhe?dH&6mAlYB45?M3!#-{F ze&>h%ge)tv4y)8LtJTVVoqKMbgLdPOmZqDQW}71B^q)=W53zo}7ja#Fl+kmpHb6E~;DQsZHY(z|KEL0Bzybm2V51O0~fnU~Q zkm^I7SR1#A!|*j5nCC+#oo_z5ho9+e+t6&i#g78JIzO7sh46O-*BXbF3Pj|xhg%fs^w7WmsHQv$go%x&+h6QQW>D%O1n}q)Vl@s;j%wM6LEh zpr%W_-rc;cOQa!I{L?0P-ACK<+T#d%hj!`H{ixG$a=T`Vveu7e9nQyJnopf~9qQ&B zZZuC7@ zrnxA`b#7yKUUzp`GjYy$z6ki}oRE6*jlO+P+-&P7Q_Xj;`-az zm3XlSJ5Q8IO$(jFb^qfzZk{l)pD6inz2n;NlS8hF#osBhR*t4l2q?{HIUw6qd9Rn> zUo&8Ri4VDE@_5@{dd>1;W4HgBOM}eH(NAr>IiqTd6()Bof>(r%3HUZ({7@5Zla5~*{APx zUW~uO(lMg6Q2X-UEa#5;z|DZt%{Xtxlv2XN=J2I}duG*p%kEt>4hs_xcdfziYJ_)o zmlnbT?|;d?A9Qxp`XS@kOBawIoZNyC&HNXH|I33<0Uogsq5xMU|F?(X?~vX)`Q2%4 zxxd*Wf5rI_@FTz_4q={34uu;X0sDt9gJ;ke4~)ZyLB+9-<)|(R9U6Ma3Ppyly)obXWj$FRfjAo*o04iaoyNnE!oY}VcYThL@UkXYxD zMCnQB{@4UH;hf|ojA*f(gC2bzgfo#E;P7U@rxq+gOVqmti-bdxG9R{_9vzUt#*^AX zhMMrnV4bM}TruqM{Jh6ZHHRK7U$}zaR&;;JB&AQk1bU^~V_^5s@THc|YFS1KD8`IH z>@tFr7lY;u;~WR_!Xfga#|NiJAH6cqFBy|SxeD-O(vcW>2ajnkf8JIDxf9Eu!v9Ir z=+y*LrUIT6HF^rTcmSxE@#aGwqx2qMVsm`3F)D*Gd4=BM&CvDR|C2)a^$Wivxt~oi z#0jn>z|qttUicL{@NrBlwEhVLgC0Hz?rQXoGeq=+Ko6jG;s9IEb};G2`g*@J|yh%C%i0x?1S z-&^FUF-%^;NsLNAxDLm~GZ-c-JvMFx(~I7l*=h3F^zf4(Tr=L!Qudz7h*B6JJZWie(7Z$hgRVB2S0&<$`gvi;U%f1qzt6~;_&?VGWb6@Jk$QxrnJev5{kpG z_x0jo&=Dof;mHXS(qUdHf>Ilm2JDiXH&MxSabbI)IGi5u6(G$Y%pmE_OuF)ACsKs; zlfU=QEG+9U(1I43@C$J^_ay)m;!CM z-((5iM)`ERK9IV@6ibzmt&Q)eBW*8})F*?Y@O*glVUZ=XF?xP*vssEu9SoU~}#fdp9MNJ66;>;QZH`i(t33k>Gf8=LRj(zRv(z~N7Mh}~s< z`1Ua&?AfSDS$NV6|AoW-!~PwI_x^Vrt^@II>b}`v^+jl;4lPgXl2MciM)@ZW*9Qf8 zzJ%iN5i#D%h8VKGUHp}!A)zUySbr!ammC4J!?M3XiP%-f>FWl5Tt>TzS|VasD2Vq$ zxFkG{ib+W$a^CNAbDqGLQrWDdL=(UXQ`*SC6k(MxN*-@xfzKt!ponbMw zQ*a&BOx3Y0VSC3!s(o^u)FGqF<|9;VdXbpkhYn_stC$!jdY7S$N*|DaJYhhGYqpSm zz}iqTIm-JktNyH%zV~?Y$XF|Mm+a7gDq_m6@?Fkpf;HI&)7V?_PdV3av0|4Mw`sPo?8Heij(DBcIn$PT8(lTE!3JYXKhFUIvb-T zMP@uJ-g_==N9F@jQ~;IHg$qC5Up;^(0Hp`dSNvCnJcM{A;9|A_dEZu^bc`}o20G=~ zX)9NN%2ojj6jRexC~BMtq%_W#7?B?6d3k5_pf)E4V@%ty&$KNK)_O;hU`ls{GqUqG zQyE{8BT9inU_5uw%#L)%ain14Y|Y@vmL-rx0~bz=0XTIu3B3~ov(Bp5t$ zZm0sa$2Ju+usHy_(09axqt+0yVxN`0Ud~{rI$!hx%5#S%>@GF{Vi|8p`9**qAr@$) zCF)&OU!@@WRnqx=awUi|k$A98l`|y-69bI4dV&+&h}Fs}`LRrY%G6UjM24tTAd9W zSj{|H=6=<{#8c0tC$y*sY5YXoxDUALFQID?NfMRDbK$~UO!4zb&N!ZsycwCitGOA= zSLqaaBJ7#od&6=sYv$|BVH0Y!ppT#-6x^2P3MHm4PT?}e| z59?1JYRdquk6xF<)x)kNK5bRIzX!}}WP>FP;+pv<`XAO$f#=MnYpHFO#xLyG{@`cCZY>!$==rr^A}{ zh763v?6k-E`+5!;Ss1g~g`_Vcv2)xfnsJb+tgjUQ)o?!3Mrz?6B&yh~&aZ#DgT-6V4dy!v$!tJc_y%YEM|?ehbjOJp_SXW(a2 z6a8?H$W(X=An?iLvnddk34 zW$Ecq8KNuqsuNEY18nZ(K7~DF+4Adw$qdBB9rA;M&hwqETPn$C^SN2F01!1= zqd6k81r9wt&D4&RXra{h_UthjOP4y-sF0;OXIL^SHpcvbD1W^sPD(J|1%+0M7D~in z;52BYKmqc2FyJX&-l4+6*+OZ18j&t@sUwS$@4HucSW>930T9i_QLHpGO$FaKfsAkd z3a^2I3}Mv0w!1Vk-EaOG7*HQBV2~k*2naRriQkj5dIw|d#A6y$x(Fh2(l1$XT1k;< z;IL^xzv!i?Ww3s!gD^C(^=YKQ0Z<|?(^l-iz5D``R(o?-PU@ur$zD7k9V~I0JZG^U zEFgme36@DMf=|toouWRow0sJnmhprVaWw^q1vNjsVrDTHBESuaQR*XjX|T(KS;Bl= zWVNXPzAn+&RL5)}yfT+H_(;uOIc=*{g2R=7JE&wKETapX0K%SK`(X9TeRD^r_-8g< zY)mOZqm`sM$OWFx?!rK7tYn0@ID5ki*eg-DwoWoHeJ3YF4~y$2cPOpRprCxHIUjFB zPv49cQIaibT@OU`WHuG_l7GQ|yr z##>v*4%sFcSSOksCSJTw!aO#6WK7l_NNAHwQDt&cuuHaQN>yS=b3Z2kz?9xNl=L+^ zJ(lT6gDNw0F7tjqquI`?gNY~Q80Bk)lo3<*W<~Zvh12zM_QkQ^vfU%f$s^23I!m-y7B} zHQxW#u!at_RMBPpt6?qm@^jZe8`hr|(>wn(tR1=v|Hn0~|AWK-|BS;q{!ehYfFF-w z*eAhD7m5F;3GqI~!;^FKkI_z{iD4NV-pLjItRzS zVl&zXMy&&4mp6CEzb@GZ#W!^HUEki%EUt#673NkqK{GJ7cR%v0o33u|@@qe5mN#5} zzdgJB9-CW!d;g=Vx%2$$reknyZh1YUyxt=weRyilEh^0=Jo#N@s&{-+o3EMEqkdBwO@{Y+Fi7r)n;9^dxxH4w_YuZ zly#8LI$U-+?~W&QJtJn9c9TA$)%GB#Db~v&BE?_zo3m$YK+ikZO9qJ8q8kRuUbHsI zl2ERHAJO<|q%ne-RQ)!IUTfZYoMm`|W&)>^wQ)iaN%5vz;PC8bLM*N6W?JTpAaB1U zVNFxCyju3{S9Q`~O$sXVPM^bcOq1^xj9$0gjcR$Y-G`aBlie@dI=s4MSAvp{BhA<@m*om(C@J$u?hCWC zJD4}m-$xkgp06i(IDCVC^0T(@@4sc|?zs+N>A7F`xcv379mWCqv6uD+@_1ARH9%)y zE+J2QMG#-l*{zQ6t*|>$AADE)FQGF9==lJWLJw@S+Q*wG)nAq#-6#8(-rtx_0Ca_3 zRD-KPq6zR5D81)`b;f&+MgdN%`Ne>WdJv;>0jl0e-;Ha1(AwiRoHVjj@DWGg?XfAE z$4EcLPfmXbN3glOC1YDfj7z8_Yb>VU$N;_Y_Xt>pLQst~*U2m>VwXGom%(8Ru6x~! z&7@tt3N2Y|lGy<3YIDra5iw48wdmKp8w8&{hj5&~M_%af-mi~{2@YWk%M@qa)`t(@ zA87!->$#M_kFq7+HiV-Gn-MJi=#-KBo)De9OAtgnv_jW`Y@8mX~CUTxV}gJ zB0^4`{aPTbX^%xCgG?S4-7lWD7@kFcOdvNgmEO^$-ThchAA*zag?GToq_13uZe|3} z=nsSG?;k`f0fS~H0Y|j$k3f>==&zaHK~PEdVnp zGH|?*Xo0asP#A<2dz*pX|(WbN@{J1k(V7n#2k+kJPr>lB-x^_4#EpQh0))z*Xxd)Pb!^HJ9A_H zmfwb7p@|PL0cog+yZ#xe_(qr@1>;^>tw35n;QwOpu7cWZ8-4%Z!JR;H4Q?Sglw!fP zEiJCa9SRh;Vub)ji#rr|cX#(fafc#>Lh(}i=XsuYt@W-w^FP@8XwU3*o|(+#AemhE z_4$20FH3b&!Zqu~UE>kz-_$AZR2|EWAW%RH8*dBAkp~Wm#qBb~ef@YzSF=h<%$7FV z`fFpg2FGjag~v}Q2F;%X4L$Y&)I<^ER=dUed~6rwfQ% zy=G4|R@h@GSBTJsF*ura|EWOVe^#E0GxP?4b0k~=C^jKqQb zgB_UyAoNcI9tgFk01{SXOcl7oV*zGQXi#S~2-U&3)2E4hba2!MHYtMs{F@Zz-4vpO zn(G?*8$6n2I_9sF%IDTAoVpT`Zv4M1DCr~yS!Po;A%%21);Ipo=4hxcgOq+}s(pSI zQbLm%P98b0w0t+;G~rqyFQ|M~wIp^lS6>zS{MdvcdZ9XGt&GRO)>P!z;#8DdrIWyS znBg5uu{|7QHig0>+6@^XCM7}&e*pxG=x@Umhys6r*i-_rG^!q3H*BhI1nQ8@IcA}D z9q_i?yVNhx@KP;xdp%+*vChol=H3qm z3;PYw>(adPm|W!lOi4X7N=XTXrTRA)D}W~Ae$NvB@~d;_UfbH;Fftr>Qz_`GzyCMgX`B9UOT8v0 z_h&+2Br?6)`u7_(x^hm=Z1nF-kOEfDe7H8f9Jzga<^AWFJew@RYove^*snv#FOJwC zGv9w8NgpZHm7hMKXe)3@G61&eyw*sdvcp^y}fsBmsE#7PdzEN!Q zVciPO+X_)f`5?+;;R<(al=qG)47!pB+oQu^V0U3{e`*qdmKjXmVEphD10XHT#p$R`&HI(`!W^AP=$$*6n|4vCmNwWO>>@3MCj0~0U<1vg$_2gK6trO~lxUjv z6wG;L5;YXa#~YRt7%}@Q3<`1rO*#J2f_Y|#Q(3`!5l&u4ut+i=6;e|z5||E21oE`m z#<`i)8G*VCU(7~4Otq#! z^F)!JG>nb9n2KDOhEkZG)|!nejEatphJlTqMUjounu?A5frf*eo{No5K#__ElZFqI zUI>#-jEze8mRdwn5LJ;=f}Be7fLc0CKvtMj9+OIOky^Pq_&FQrOH5?~VOq6eI<00_ zgGI_$!_<1sbZ=5v&6_DhQDkkJ6YZ?wmd(#J$T{DpP+Bi0x_Ksfgo(dvrt(%~^|hvS zO-TwAP7b_HVkJ+SGD)r@NDf|1j=Gfz$NYr2g~qZ`e!NXiPDz2Pr#ux-ndnKWa!N@R zPR-Mi%*Kq*T!a=LP|VDyR@|nRVkQ(1L#u}=syx%0bnHe#?d%ljns3v(bgWw!dFmGf zYpp*G7DM|zBZdz?jfX);6=T{x*{5|_zF;ye6f-P7u(2$&3Cu1APkKUEhv~Pi8Fm-B zHrZJBt<%>JIFB&HzTbu%=s-_XB7YtvTnj@lhhuK76MvIKe<{ZP@ni*sGovcSA=|K` z+c0A*eZtgb#Z_V^P>MejW`DxYOsbSX%+5}Z#Z0Y~h<}(wH^M<%BFIpZ$x_0>luE}D zo=sW8$>~MMbC}JQ>cwW0A#}&Wm&zn^m?m5Tldy4=q+k&ni5H-FFO9__TaweZ$gVt+ zp!kgArIO97R2H>oOj_)=@`r3Xy1W`o%m(bA-#qg$ZDBUHp|d<>v`&TCKBKd5VSH-? zaZ<|HV-GVgVSd+Q<9?XuZIkUglJTA*AfSZ%A?S|T(~B|GM(9I$rmIa%M0ig02y>V& z<0mXgLJ1^^oiSyJHq8r?amSEVLYt!m`HaOMd6-^k6C2B(ReZ>rUs6=go>Y3rR7nA; zPi1I4d@(0jN;OhSx?O4+SK8am-ZN6%)e<>a!qh(^G`z$%N}brhQ(Pt5lw5 zQa;RB&Ky==GEyF%TYf`V@%5lwL#iUsw1TF%LVKj56RV=+pu!NV@>5_1%%rl4p;9lf za;LbGX1h`pt17mqa$mCQo}sE}r0^m<9lJCg1G^C4yMo{s=aUFVH0<&|ooYl$_0Ofe zGUw`3P|ek16?mjtmA>X)v4*~+ro!f-1`$}3Hc&&vQG0PvBaKvRMv(rjwKf#3K(Mq} zqEtpyq)w()R9v~%Kd{#HRo$Z!?|4^-MaiI)_C#%&Ttg&4aydnTGDznatroVe9(JkY zZ2iMoy*_0_gHl7XaYIUX!%IX%Vo5{NX2Uy##XDwj?G3+x~5pk zCJf9*L+mEs(x&Z^re3c~*PXgJk!CLBVgw~uR4FBcOmq5jbBHoo7ItisZJEbTbHQ?R zB4z!qZc7R_c@76zWkhUw1f~2=aczWSBS*$-J$X}+mbKy*uGg*3sjX1?w$j$tvZGe# zyfzfew(g_0#NpP4(Kc4}_Ra_Iwiwg)P=Z$f?siCVdnH{P>Q=j-WJjoCdt_Rhpi9f~ zQJt1a#~`RviLS$9uH#Ci?i9P@OGL-DWGBR>6TnHo9qsg2>PoHaI236|#%YU5>vA#c z@+t0okKG-@-rc~~j=$21eP2z|M)4pbO<~7$&QV8n?}uk6OQ)|4YU>gC9xv?`=NlVe+YB(eGsQ=@7i{tqAKKis+IN?PaF|-pBMQ{YOIlA0@7?->>P@ubuv{ zgt(Sy4;(ZgPta?U&c!84w7J!9(>7qYGT?AO;7B!Sr#~PjIVdAJV0lkUpElsUGU#_d z_~1`96nNb4*7oEBl*l8!_bhEtvU@P-ekg`&I8Jm}$7e`=bf_S9NUUv0L1j4eemI+I z#Mf^4spN=6&aj+Mhl(gf#co7!bHw#yH*5MxdfN!n%t*3beX|Nhk!V|ZI$2bDUs+pU zmCBQTyP=w~UgOxe+kI~z7i256P&bf3?g}u{{kJnR&yA`FH%vxBfuo)JZJTxq!)0=B zK+fCr&O3stnut&&x^WPEoR!S!izw{!f_P#C+|2_vwAK zzX@Od9--sxHJ}ULk^RW=9L$-4I7Ec@yZb1uP7kF|zn_|W5B?IwF`qp>sxRp`Ztll! zFu8j^1zvcsR_J$3Ixk{C)~!EJxjJcM(CED?i^Mr&;N;(&;13s@+>}~4GFjN`@h1`c z8Z^CN5jhVHSmf)T*V~*&+0@s5KBtE}jaltDR6iboJ7ZQ(f=}Y`4^ZD@b@*R_dd!TO z@$3)bzGnt~8q~AE53NHcu#VOH&*dL_7Yx=PJ_LJFcb8_6l#jz)Aq(F$!6DgtyEPxX z$EV}J`xKXtet7;xe|q-!(xqrX_LRn36aMvf>Lt*U*5M<3WZC${4@oT%Aas$R@4JyjS zN{TEh@(&Wi%o-x`QIZMbvTxyV5FH=p=wCGPo$3;-?e%|D;Dm|pi7+S=IK z`flg@=+xIqNp&V-nNOw-Xbv5#cPPf!+5OxeojM2)hMak@Z0TPq3r?qj#eg?`#aEt2 zZnwQC$$OY|oY*Nk**VSyWS)a*$pX`0uto=xtdm@!iZNkvNWsZMulW9s2?{S5GbH9q zGbt=i75oW+jT@3oPQ-P>z7DJ&&1If=Qyv%kk;KzXuf6cxl)~J4angkM)gja7_nNE! z$%);o?`0W>S=y(l)1jHJ$S6D~Ak~xY@l(IGt|Qp@ZH^zXfUSiW8dGAs062Vu{vWLV zfYy(GX6kgpPw^eu{;cES)Hmns+~Eg~!N(r$4fZM+D;Ej-x-^7Pdc?nzSKw$57NiTK&g=XmxjslVlfr=FLR)8zaGOH_@M`;kKyuc zJwgBx_v%W{>*{d)(ja!{uWq^I4~sL5EhH31JaU)GJiYZxt5aejOMYkAnuKD~d1@Jm5xi7%YNqyE5?LS!sm6bfA) zl{f^z2jTdUCC3DI0~CUeU#9}-J_I0>=>m=*WKa+}+Jlu5_Z%)>?gY1goa*jBO1wGF zSS3}!eyuO%?}YeU-uox~MKAwJh^rsWq)7!$m{DjPs+VY#8%AOhA8A$?wELlQsFsdY zV~&Q@TTep<0*uMRi#>QOx`Q~rpc#!i+3MRqbSePhlCW|k)?ta4r`)Uq2@{Q65e%F7vEPy zHGLm```n%GE(~UM`knxsr&)%u9DcIbrXp=Xsd7G`V-uJokd1A}gw8zrkq#Yai~}`D zo$MQ;ODU(j{m%u1Q^{qB(rE=i!3qyyPWR}6g;?;jG69fmoffXh(t ze_TMQ|DaD|>1V7Q6gE|(NSR_c1EG;N$505UfhWk(IH)A#uz<3&tEf1#5kk~V$^POz zzqaeNO;ctrw9S)#7tafhMmzxo$dr0tQ2bJ{ntJWpCzuDAfcd2o+ECq@$Z>4CbVCgN zC7H0YrwFk7?35FAEW}VXDjubKPY;!kc|?fkPa=0c*n@pBHUy^!6a>yC>x$s&D&m%O zCwIo655qaEm-nT{?fQHhQr~Fysn+YKS%Q|^td5DfQgegVX7;C7+gNB{^CgfG4Eho1 z5A6K@(ppOV{<328uRf4#J|g!GD|MqrFCD`t>qHSxhB$*ZYHpeA-#J)Uc09D)S_WY7 z*%|edjXFyX=E=(m z!Nje}VS2ReA96JEIz&#*%TFk60Y7Yqr+N5LZzoh)tzzMzOf~&y0Y!X6Ex}cM3azt0 z&nF;1cHC@iCPVk{&9|b3Zgrl@76wGkU|WX$SWS6{Cshl|76X>iXXr%I-cAvt2kYbp zB;ZEK8@~N=zUz<;!ew{7n=?PKBfeHw!LS!(lKS=5a zbf7t7xlEa?rsKRWoLvnwS};wJtg5etZ$|q`Ql=_}yVdPl1v7yB)j=QV+bA@rIn?V+ zNDO|$Q-=HT?$1e4(Jj00s(0|PvEjV~F+sF0-MAh_+7E<;C?Oce7*u3E=wve$6~BQ< za*Sy#q#sz?IFQHDxb7#POx$4S%8Vat5iFhA!OYP<`o-aUjpruhzqC)^@HS zw&w+ou|9z!_Z2k#&?3r%^R4i1lqylCA)l8Lqt3zdcZj#kZy--2Z0TkvUm_ zn64N`zzDaBRT7$46^d2_ph$v^1qGcd3ntvs?S=MIpwEKl8h26HRg`qeBRPnl5q^&$}3_X443S%iU~5k$gYrj z3MNbie_(exw8>`I?m$bd4ZJ+EB>1K?P4l6uR%e3rmpK^y<7C-3$^oC2vs{R=QKY>O zgPn$ye9%{dXfJ*Y+N1r!sJ5z#5~#g%e~r$rpgSbT)nQG6a)MCUZzAd3_dkU-@vyZr-q%Bp@E z-(<6cW5dtkAL*86ik{=nd$qQQR8|S!Q>I3EFLEN|tZtEXr}N1#K3_6h7xSjheDOWc zr}nk3lS!TJuem5xCbD_85Ii@r>QdagWvx+oFjt;AS!!%gBk@`IOKk&Isnc_MozoW4 z_A3FvpHugxj__CgSGXb3?Zw7izXZky1nMO9cFi7@_`-iB#MjZ>oBmFS>n%>Wxt33h z9k@QUzFswgH8lU75MN&VONrNVes_C$x%wOJvJ-Uj#IHAL;7;zZgt%jf(8@9@tw$jW z&6$hH;@=5zfsTKaIJ)Oh8p@G}$YVlW-g895&>o?-GWWz?I7Q~~g!tnDvgd^K3+IgM zzm&Mw)CckN$ae0@y`i@5>{(D>d<>d6=3GvnA zzKXlW$Aox8qgbzryZ6ejxO)q-@T}{g_u6I0wRca(>HEKw`1}64zm>Spmfp7e-wAOE z(e1wz;%ndI8vja&d*+$`lMr|R{;z~MKL6iJym4))#NGGUT;i7;Y35bqqZ0pP=e_!< z#5wms+b^dwM1-fqo7`q;Q z_#j^widh%h3U6gl7e+iB)1?cmu4^W_3umqim#78%q6?p~tyQfJ6{VZ7Oq{TekBGmU zSYMpjg^$#%n~X}FtWMzJQ#U0MoC3;6-PcVMFGh3B3%Tf~lM$n9<7Hs%VMGyQ4CZB4 z?_sGEWl`Z}3+`cec@SkM;)T}raPo_C?(lH!^lMoNR$!7<7wZNAj_M` z$kz4wmG&ie1(IVXD#T;|6)`tL$V}y`wDqZp3aYh{g|LFEbYf(U5S*;C!ZQ83{9+nZ z2;5|%AR|<}^S&z{P{_9c9U@6R{(=2oS>TbZ8zI=hMex2)HRPBMXR zOx0b0Y*36W)8~F$#=+rUSw~(39KzC|jYlzr{E8prHPN66bkJ)~OrtD7%m~3=^ud*% zDd<5v&$DhYpsd#^J(~3fC8P*YIU7{Q0vKW*Q|7_a{0f0}L!ErGddaaCCSibQxlP+p zOkcZ7pFcS{O41L7dFy;LqT$5*o^X|DT?BH-BUpzIZ`~*axD02QwJXKTSsr|f?<-CS zR?OrdsrjjxgsGISt{9#-_&Hb!6*`h@I$TsY@~uQ^cVwh=N2$(x1eQKhQ74bbI9jvQ zGR8Mrr#^~9r2Il}v@uvYU3#=BZ?pxarD2Z0b#AoXrKWjjv=e14vR7GYd1RYSrE;vb zmr8{IbClwKq+3m;P=8E5Lgm0lCA?H6CS65pbWEgmEK~K-dlQg>s%Qxi+SYLo8j8eP zuZrl{;usX;n4D7dK>n;LaqP`;&@&k9EY5N+dcv%FazzFA$qUY(qHks@-iszIx(sQ) z!qg_qD1(GFNk5@xqJ&umc`By@{}w|HF?P^ z8Ih8FMu_;pjrbUb2pb}2IYfN-QK`Y6JYAtbwUa_>4|_VD3T&kI=T1hCK{|o_?x}=c zg^&Fh{sZ4q8#ieU`KIQMR6*Zc@yDeIBEz22WdLBjKHVx159 z|N3w=U=N{2eKouBN{r!EG9vLB)Bk2zG2o`SfCwXpz69@e+3y2dM&E~Y;2AC6@5$<4 z(=_dokn!rXJ~nDBfTo7YPG@>1J(doMDCvr%T$ zN?3q0#jJ|SD+h9nS4xFWXL+xrNY$j6g!@~efUEFF-U+5ks1?mRR}*z5S)b! zl|tH><+D>^zVTd3#GL%^aJAp*qF>Ylriy`$Vg@F}rQI}BJMBwi3|3k8p;)RAtCDrI zFAy9}b>A)y`$k3If-0$3v$0u`tJn*(Sa;m-~)*@h7FqPCa zhfV@k<*rPnZu#m7+2#B-oPy2_Pep+8 zN#EGL2vI1~G5-p9Cm7EV__^w!A^V%n#Qr2?xWodk4z)gMv;;8elz^A~k(VYnxctw@ z-{0q>F;zh@kwTnV5pk?{c2ysjilXjVFDNjuumS8}i^5_{Ir$a2^*OOjDs{eM^-Oxd zOqQ>C^~$}Llc<&(>?@keQ=4~H+Bu~=>h;`upS2~7$z3jYa%w?2SBO+ro|ftL%Boa7 z(HF7TPm0hVylfoa6&`DE>u;Bys9#~7)z>K1&*0a1nEb8JM{bb9w@R(Q+Gx8vTmQNb zcU8z|^-js)D|O8xas6^e$5Of2YX9mUvSH)JD%-X}7w*~w^;(<0VIFj?#&>PUw{tI{ zZrdDkB&L6$VYqmyT>WM3`-hcp8B%BMdgs5_mbwgMz8m)Bul=N6=@M9{Reocd^5(ky z%`c3x`!DP1KMk*4SFbeceiLti)`YJv*Z(9KAZc!(o+u-W8!bn!vwqz8(zG) zK|i*EKG205(uO^tg1=|vj%;*|yonIm+<3mJsb{Q0v`G*$N9xcGyEp|2f%}+j?Z`bYWca*$2c_Vae z{uyfVgUP}e%_8%uMSz9{wcnn3MW?}9hlK^Nt%IVS+=lSnUd*utMuElEFN+8&%cjUZ zW;{!4Gy^8+zLw^GyNzX;sAZMPzPnqt=R;JhN5!sJ!~Sb(DPKb#e`fiB6H^}&(ZB|| zV80c!y?sBl`H(2_4}08U4YJ{xf(ROk2sznE!KPOOR-pyO(H7!Sf|jvp)&u<3yA0Of zo*#VD%uW>SNJz9ycC$`Vl1h;i2&y>PpRr!bw?6K*7Q?amacun&dYDRcSfX@z`^+ZE z@UY11a5CJ6Km8E=+uF|V@Kc42*V19snzhg2p*@!ER@-4E%~Z`pdvym#eT7tm-@2g7 z5z9y0@!+E}w1Z~m)fPG1T5;SqyovTGt5!FwPBdsY%%E%UXbN(?CTnNLZ|7}zOznHz z9AQUQc5HI_tuM21l%{+*QDh=Y@?nZbYjVPJ#?WF~P-WIZWKK|Wo`z94BlVCmfO=bug!c?~ZrR&(6i2aD>W9CRZ>*&!+v(X7$c?JI*Lro|0P{ z)4Fd`?>kwboxdJ+I)k21iaj`6C_B68oy$3#Kik`5WieqFGNGV7kNfb0jr1IvwZ~~` z#r5(#48NU)i=QLfgg?s!O8Sl({aw4m&jrn&K;}=Y(sywJKTo&MpDsA#vbV3vz0}b%!p^(YqczeRyfpZuth0alrcqfB{mQsd*?{HB zR7m-a{FV7S-1z+#MuWr8$SW10L(9Ue->p|k@t2nFSC^|-&G&AYCvHM+t_~7E?c{fz zDn+@{uN>dFyJV@^a=AM`NVvaqhpSI6+rGW_D!ld%br=2O?i0=HUMLz6E$tcY;2nDU zzS7*4%fm{@V{ZJy_u4&}#Y3ax2H)a_f5l@U!`*4$J*Lv*E&i?hq(`xfhX&qF)alBn zPN_sL`v|VvQ1@H%klXQcO0}s$fGi*x2^i%@=ozU7Yy>NOLt*%Vf^mbQ>Oq(xgp-AS z2Y~N*{&;-K^8EPT!6OtkB-snN3CM^>J--=}nIV8I-ev#6sJgxtuk^IQ94GONC9}p{ z&LiaLj!Og+((@2Lj>7YE5NP6rlkk^QN6=)0@IeY6%0G?{eH_2R*h0_QwnX?J`+U_(WPbKFm>T1k z9U^q-Wt1Y~I{52NJXtsaqHoX#n7T*XxZiDfII2ugG}FD6@TJ%!_;Pwz`Sy4H_1K11 ziavk9bC4_HyI&ixRz(+(1MD3LnARbdo(hW+-uNPtHSG0>rGSjEnr4=gV|a zZN5Jox-yPcnhYA&ErNkaX#^Sb>!B&*rFx`gsf(^3L4%q|Ob`WxvQZF=8Tylup?dDE zzHm}LhvVeE&A~XunT>u`NW3U`e5*}cVm$82UR6Wd>m^#JKB#nXVLF-j95;?FURgPysnThdR?rW z09$Roy*ON`6^icoy#-Q(aaAk)&Mm&hDNI)~9scZd(cP%;f*h`q9bmGWq)LHP922(|}~+Kn6G0EKHosm{lFjd{*KQ8=hwR03{PkeAq)+ zSTaMj*xlE)CkjgeKX&CIyo*gk>Slu~=Szuj)}P$!+AGj~qXUC+%xh9g z=u%?B*>TE|VjEVxA~+Lg#3{tq78 zub&8`#;t*Vth((z?mPazaExBdRVaEd)4ZG9SR1i<3axI6cY&vH+Ci96I;Ho)x6?{`ElQL&4_tWkFW2`18&f_rd;nX#VQb~iGJ6^?|~g^HG^ zL*>cXC*t&Q@cIXK*gdqSjY_aG^g4*1nI~mP#kt1%ZQeZnHlqOKSQ72|hV&b8`oJfw z0jRh}0fdQN!O=2w7*bu5s9Q!M;y2x9R{V(+)i=E_u{h#$8FNqN2o(`RPx2h&;x!48KGr7fPG$p&^9KwenEu$Y-z&ymuv#~Q+Bxu>Esf1l}v&&dxxNW9Q_;at&c0cO?mk^r~VFQq2L;`+}cHCyjKSB8JdHM0+! zqfiCZo=I{?nGq5ZB7sm0nUQpZk7R9b|MRk846jxTR$m4Fzo~Wj$S;(C)OvBAns&R_ zd=0xmUfM2HvJh)&I^=oXWXiVrA(_r>A2ATbRA%rhf;_@(v%Ub7XHQ_I4X8q*lZpXU zO>c5c6(A_fSH)sDZoXbHr@UCo$o8E`{nwfLdhj&Io8MU4-GmKQV97EQ@+0jbl32P= z<;Uhimbzm!Np(gBmEMxehM$J^kf`sCFg_^;u~$ulQ_pv(x(d#4*I>_;#MGzR+~#kxKRQbyE;ElS8@F*(s*ViP=&c~OY)!w47m{Sp#sknI_lt>8=F>740!cxJOJ*Fi?|5y z1L{8>OO>6{e#R`8s5dmKQiYe&^#QSDt zp+mlDoj+RuEx8XmhG`%<5ifFmb_*cQtY{6@0L*r;c#z-RkmP6p6h>R4ZAKrwErpMz zk=(p?GwE7cL>p7;yalS;8HGbzS2(5ITNjcxK~o~F3#7g=_p6c$mURrHII+F>?=SFm ze6~S9Zax*JpI3+8+<`Dg#v;D9)1Eq|-HV}Ie^>q;MtQTUyvj){UDSocs5DwUi0UQ# zy*?a8cYSd>{Zvfm%yT{UA#y_&l69`}22c3SUHA0yG|fn`0q}7ZVX(dzV6?=xks7m+ zEVi+-Il7ucduP4+XIvMc&z3#L86$&S_0uX$WmPS{nf$mi318Ejg5yFnaYfe)7MFn6 zS$hYx`%D{4JVr#%vfJ;CP)Z=EhB~{RboC(r@2J4Zmko5K94xf1(^Vy8!(dFBH|0e} zKbwsSC^oTq|l-s|~n+`x-%%ELtYU2&?ff z_a^RE&Ze~jtuD%gMoyMd4#{2C9W_0@pD{>qYb=MJmlJ}&m4hEn3m(y=95JCASYSzf zBBMT;#FqZ;((r*wN@ljXYgX7~&N%u?ROZ^}W%74G8i>o7&Q%ZiY{Fv6(1v2czz?8wvPBi6K z*Uu<0@nH5$Tt@b4S$0AdH)U7a#SHLa#41)*PBiPyF%#?96bl(uHqm=6z9s+FOiefV zg#$id_W7lQsSqBMW@3V-AsSl>A-g&4C!c(oj#TSx3#qvo&fOWkz)=N z23w4TfqjM@syMg#a?dQKFqn-)%z%%1B@pINwgL^m0v@D7pAJ%An|WXMB&)<3wtOwE za3<}NJ#(@`+pRd*+00n7<;$wL$Nxi6;Z11>=q+Im_6QS_6O$7~;p-V<+qhlY@jcH6 zsX~{Ue7)CJzTq0LGOaRpSiFOC!%5`ArR2h+2;V2}#h35dxlsfx#RUvl1ZL(oaTeJ> zvvL^73&xUpYq%c~$Q%K)PT*%l8z}meNaFT_EkU6;VNE5mgfzY&G{T`c*X7`y4_k7g zdI}A3qQ&E9rI4y?oz~Eonpv#UR-Ar^kpZ(#cN@#-_?DR|lR0l)hhWRbo6UZ$p4AYM zO;VyvWutgsoGWOPE6y&XXcPGK&`g^>e_kcQ!Y1CCU6H56$AsNE;LtMeFx<;VE{9zq z#YQT;#I&iT#LXb@@StpfJ#Vh0{7Su|MP2{oFnQ}Rzs80KtF%%Iy^4gRY>WJ%nq;#k zSEhDgt(JttMCNFo$rhn%+h<%_MpIg8Q(6~D-*{3|&py!PT+)zeTi|un==Y(;g1n{2 zs?}t%dEm&W;z(k;)VrO-_}kIv3EQSU_Ku}e!QZ9j=Nvj@b~$&YT^$QOBWhhyBt0}k zy(6UEhPM4Bhkb%}m3d@?Ze@dh(4mmBp(yBZV%cyebi@t1o(~;uC>!m7jt!KJO_X)c zl#Q=JC-%xFPN1Kx%7o6KQ)uN=c%0MpQzImtGtA{PFwWsavRQG?Il1q%chE1ILS9*3Rpb8-3ID(Mwf}?F z{|Br8A7S;Q?@FNHf3W&V^LoMPe)Dm|XhqA9Ew&2zodMg*^q+3(r|tI*DO~cut~j_; z|2V|I?M7y~XX+uRrmE-xbKO7Ii}Ack(wA0gX&|8rVpGPzFfr4Xkp;+3iT z<(&3gk9t`>%kQoq3<^ar7RBNgtz+5 zI<4ZFcM(_n-O)*XCh5fgiq(5Fi;g}19jlAxg8rllwq$Y{oE(ENvVZ^oV)dImiFNY} z#+PqT;FsujT1}_d|Ap1B`d|9#Q;0>GV&(6 z1X=f%IoH3iy3|kmm>{ilqf0^)3BnFXwtL$gyuYwI+K-S2?z}i0TGk$NUWWjtHf22D zf3W%zvI#hUha0?f>P07$i_*G~b)x7Lu3D126Rscwjr;MD`NEL2`C67cv&=-eHTPiz zA;**%<88ZQNV)or_h9$s+xKOLgxBta-*g3YhZuiTv^S=1l zmIXPmlvb{hjazygg@t$yGnmhO#Pi8xSwK<(A>!imp)+j6L&MK2UUQcF>~fkG7wm1? zMR?>fQo0W-2j0#YbfueVp}}E~sSE%e-X%$x?T^Zx4Z?BkLMHSF+vq+?TiV%!L%_8d z{`qlc(7m*%urYq;X^t_`Bot;-voRMKvD5R_5w*`){zSpbsK`!$NVDpg?H=#gtnj`_EOgy4J;W*lWHJff0}SLz2er zBn6ijA8TwiF1wso1lF1xYtNgsbvSTs{1=+AeRu^%62I zP9M71*J2E2stT+(PkW_T9RmtQl%|=Vf}()wf=@b(bk5TdX~E03UWmIm|&8ZrFD9aewE3&cPw{*`ur z_^-BmZR+B&#Zyc2st)3^By{w>8yC;X9pl36e_{1Twa?s(*xxQ7cmH7ZNDT(SY9_2LVqdRrDto}Hu8^J7O!A;wNJrbjsfMbO6 z3Tl`XSo}X$PmzQ`ORxZ}zO=sv8L*}FEv3{_WpC>uitIT8KMyYP@H946If4RNMS*Vx zLak%BjxP9&*o3r6!F&!d@1M2$w=PdxANI%{#TJG(>ZF=I!FW$@4dK{&PfvYOYfLCs zE+!6%J)4@ie+Id9_k+4X|G8O;c+A^8`x~nxJ9$de>N?9UE9}YE_E zlu2`U-$wt2m_nqRhE&l);@ctOP-~CwI%kC)V;fxeK`L7 z2xZ)i_ia+_wB8LAd6-+e$h&7ahV2oJSIADbz($Mvr&)~4aw)$eEo!3qT1kC-gm3eT z5qK#n&0vmnh_dHF0|?b#Z%+Miaw%5%)ls0~MpL5spgP~@6l0C4Oe?5q2IA{%{(dMb z>j7?MtJnC`uc7=>w_4-SzN64?n61@Cq)Hi&I zG5kiE{ID$b(XD)5)cP&-_^0>!7&LkS5cDlx^e0cfiHE#U0=zeKy&sa^wUYw7Okkf~ zt)+g0t#gBK3pR(AHfMo>OPl^sNe>rCk1)%ChEVXld=N5$=O(YGFslKolV=JG7>NWx zX)w7UhFxg{Glc}R<^~t^gnaD|=Ag511>8*bJ&B5fc&xzIq%hc&oBPlQOF3f_W-wWS zF%O3E!zR7)XZb+ht&qGe#5^dJo$ier@Qzn2lvLpZ-%uc`6FQv5bHlh^ki$JNwE?9LH6CXusrVQfx+G4jH_1c`c2UPf&Gz6aX z#Kmls!&IcV)a2Im)M0E4#ZYa&>7OsMs@+n)45NN^OQ+Gys<%j~ zn$EvPKaX)sJ#jv{N7l4zp?H@A*8W#hCjrnGEMbkRw2^AvYFhM78yD znR)OjeG!_ENjcq+TDF*4Y#m=X46Qt%sL)AkP_z@`P4mi4D|1TgxJ`>sOsj5&wkbx~ zAlUmoS%w!8z2t18IxLfz4AaF7vteB0I;>y999h1m`dVF?>Jeo1nIC? zIl`H^p3(6r<#2{`@KMkSmE^D;atc$}3LLVCDalIMWQg1$q;)wYmmrEZx$>#b&s$!+ zOl48NV^k}FXeiNXEy)j)=AZZEzu(WdjmsybFHn*ya7Hee3MnfxzM=>tfT~;`bxP_829`TgAU6OXQmh1lddE!i%8ACG9&Uxh5q)=t}P-OUH&w z5==^Cu}T+)N*NDJEpkg|Fw1o5%dU*ekmbv$^U5+t%F+VMqV~!@vzMnJm7~j-69$zY zhnB0El%H>we;F#5Dk;xIs@PGi5M`_A46h(6t}x!I=*Ox&7^#q9tK_z+yi}^(2&>dI zsUR$_+#9YWXQ(>HtU^sILGw;Vp)AA}sTfSGI>)STUaAV;s@yiN{>)rmq*z_kSFL_n z{eW2`6t2Shh z>sc#Vrn= zglFmvjT`s_8j^Dw7P=dBHygM?jq!AiiwX@E){SwJjh+#WT7!+vIgLb(BYVupQL^x5ve?oj6OlqwhWg~R=6Z&lXpyo6k>aG%=3J4Mcl;6=zvw^x zBBGFPDHCZ)|JCdp*Ycver7(@G=7_WrJEbbEIH$EWR=YI-y)A#gHA`2fnS*e!m2_B- zYBYkVPPuJvx{Vp7-9V}R!^2Xm@voMm!)AH2b~LuO4Z8NKgZ2oUwhcY9EoFtBR)zg# zipjM0*_MvCOC9ZD?da1jHxbP|GMyxcO?$sOZz;Rrt)1t}c@N9&s~lZe_h~3??M1eo zrs`es%Uxx09WrMf*Q1>Q#@*K4-5s0Vk^$WWIGxBG-7Cf2#dJNm!9DLmJr5H;E2$!5?eh11+M_*mRIvA| z{|&1f-uD|(4VZ`ynCTB#_zYO3512xG1-b`BC3{^_8a|K%Hu{5ZK7$_VgI;ZeK0bpE zqE8;)mpyTWDkzM#sjmzo(ucy^hCZ$g*-#DffQEIkyE*K7-nCI}Z4ITi4X3XRXZj4p z-4o{6Jqc2gM>nZXxgRcR8!1~EL5PlUf<~>ChXs5_UgHoI+w~&{_SfLR8ucmiS4R0S zM)`b(TA+|Nm9aFsu~?N+ClyGM-Izw(sMgpRtMPd5@mMew$qm|zUxF`o2D~)DFtC5v zu8Gs{E0t*!l4+GeEtPT2kK@dAlhtM81^2|X@-R9f2N2T-RGtZt>I901!=4I^(Y;~h zeqiSRWA84z;%XaoT^C+>;SPm6A-GdG!CitA+zGD1-9vCsa19pR-QC?iK#)L4WmTT{ z?Oxq$?Db`T+GFhg5jAU$d)~)&zMxzi4&Eu@VqcDnVGJ7es>AK5s}gA}evAIa1Ol+n zK;u9f-}FG?GieyD=$p`)51`qR?3qHGiEC0X2tCMyUu#b~@i`-!>N1Wdz|&_qlp%hU zIeudCV$R-vAs=p@@i&e!P$wtygNP_dI5$#oQm23jP&7<%88^r>IY+&_xa=^^`^I=S z+*oX6R!DhD-O=+GlmEanfx+)7X^LriM-tNjT!r5Rl=7enq_{mj4)AZ6NB+5^M*`P? z3AmIA#enMA-;_R=1TTz1t%u7H+8K-AubIh!j{H>()AgsjN_=Ib9QI0*ScDd7{PwH*y+&ERq;=^{SZA~;6Xs&H)^ITu6+qa!$>EW-+G7NY2r@W&A2(&R z&}c;IB|2Ryx=lK}@N3aTU~=T(QgEim}@q!TX}K_kwL({6yUltNFQQ= zQ2^wJz@sLiaGD~yxDZY&52%Q2etIErJvIviniFs)TE|DiU9IVON8u1IxJ@j!h5hk^EyTH=j|g< za6AqJHi(F+5&D}G*VjrkUxvS6D}WBl`Rh(059}iZS6@&BuFVlEltyZjNPaDs3Dp=uR%sT?2sfX$Qd)>`y|q zeVcF+;PoAxPhPKb1;Rc|O-R74fxo!DefRYSKI?n!(%E#*1%~QAtg*iL9@Vt#yh{({ z>4HcxlYj&PW^kgKnp%@OUt3RI)?8i6Q{5gq5@v#~Q>pKm&>rM!uircT_$Br?u--xs z7sy0nmslYE;VTa|p|%Q67Pyt-J1)OCVIn671hAc){D{@|*lU01^qqk3AGnUxh0AmO zsO!3erAiptje@*`yrn}D_bM%+);8(GG%FLwDlF|iv~+~)x;w$qTb*#e3% z!tCVp(uUf1=kxy_SATfG%Ykk$hISL*8{txQKOgtSrgHrHZRm;=>^cMlkn3_#T3hbb zPk*Kaps<5j>+}vZeu>_^6n4(d))LQS&j!@S9#}_vEV|Km?AD+91wWKo?vR} zR5;_VAQGmT{$2nT4b~TkdOtE2nULBSP8Wa-`rq=m3uk{16(&|hTd%|d39=f;zp=V7 z^8+HO)`{A`u(~_bpty22OZb0ab&9jbQ`M@!Se;DgVkOUTG*2d5=kjec{G_oz*=r|* zLR#!Ja^i?0;$%8M6%m`8qD_FeYXY@fl2T?jK9U^1`tA-87vW8ufF5-)q%T534T?dX zG$%nsBpO#_;O=C%RK3o%c=i^C)$N<0`bPgG&D|c6DGj~PHwLk>zWedhU~;3B#_e9D zGw#Ij3!jTf;b5wrC8FdNMD5X_#b6h)66u8$p$31E{{>0-;pP9_V9NmAh>nm(D z^#8K!z`E{z^DyqIHRDuhgNpF1q*^b3vb_tKkI7D|k7l!_T$n1JPOE?)iv`Ri^~!v= zfY9arE*M#!2etTLc0KSPyIz<$C9FzsHza!O1-iM(Wd8qWzfq=}mBb8G$@y zMB{w{J6r*zo`x03EJ#bA0f6x1N%Ow7{mSL>*1pz=Wkqy%O{YZ+Nh7p~2N8*DHi|Ny zSJBM~4U8-&+!1Bu<(#rxfDB8@ArW)HQth-~%N$zlz7FbW>-=tm#Ij3INa%Oi09(|& z=P`p~BivX{3c?8OP6|P+9n7CY`OZ#0ho%f_w|>+>GcEp;M=xNNIezA8mF?X1W<6_j zt@WET95e_)O{p|{#VnT)6P(~Bk-#(uVCXEL18^v}$`e?%lp||pA!xuIAP+sMgxYt2 z0G(KS_9wYByh4lv`0wIuN>E}P>Z4wbS51hC3o|wTHpLRY4)G)GxVH6(;Ir=Y`lXK* zbEIa#*i75a)E~Fwe9AZDVc!*iGAl;DZv z^oH;l?bubp<@;{bj?jVFsE*Kye$mc*<0UkQm3%Kz*OSt8!RenirTq_^^m%@M!M@l# zUah=|@;?DlRPvFx5na7{g*dvmGdaaU_7-{yYT$ zs&M=*SPjKJfJ+^qHXu?eFdayg6OZ(|rT1AcQPr}t-*}C%=L+tc!5KXW9aapuot@MZ z4N8Rg&xB4yK^%n(Mrr{)$Y_mBG}Qu8tY^a#TBBFKmg|Kx6?{xrO&}Be*FD8T^~!>kKDD&w#Fn2WUZ<(^Q<6`4ToiCd#H+oB=h;=hG6jX1nqmn4lpxv& zLYbxq0VE2dKoPLViGL8yFO7BVlZ;@(YA~QSXb|uo6hcrpVGob+nFPr_=_T3m!w&8; z9=3T6a^F{NHS(yAv?FO)aNGC+x43KVPUh5hF0G1spWS1WkjHmir?w~~`4&1eEQQKV zqdy~+=B_t}i$(_=f=|IofV}Pp1Of4x;Q{2C^e8=OADcGlgW`Vns={s)i}#Nn>=EO9 zVUCZfYNRP&51?u;E7fZ&yOY0&!9C-@pTw0I|3Ol4yQ5L1++A7;)fy{@#IwgNR^Zl)x1@ z$-o*9FKQ|n|2l|GX$M~P5t0&D<6ioCN9Wo{vx1VoKzp!4!#7jg$oNyG1&KB3xNPVJ z(vBd41p{mJv*=|9ckq!^K4ig5%{^% zdo+|&=2i`W6ru%tCAT2~A`mjoFr72{%l1lY!xvf2Bn(!15*}cWs!J^_GIHMf8!%ST z_Pco@EjnY11kwgt%KMSwxcb|~U~&s;Y(Ytxih)S)VoSSEMB%dH~Jmu{GmZ%=Ot zJ_zM*zUpKi3uSX}9%M`Lf(ufz#KmKr=1JixCrP%aq|1IDwfFd=VD$9N-F81n5^zJ7 zx(IJwfaKUG(Th%Z1K;x%%TWVF^Y`R!p+jJ|OiqGDBc;X*%qS|au$#T{`%1f;;)(?# zj=r}NpE00*`aQasz=UA?uAiNdcF#1&1d2Dk!o=L{nyZ(yZ`74BT)McL`0nT(*}mQg z=h{v3q`U=vzsiuZm|=Wj6&|f>YlBjAeNJ7D<(XsVxc$v-bmfcXGhOC{QQB>$Uyc>; zuZT$tO1JFLcUFR`kCPq=H@P<=vZB_4Q+`XBxp2z+M_6lv0epA%Akjl{#w>Ai&&HiT za$9@ltT~OZ?vZ2xr_I2u`A^1orTuBP>IUBy-j6Z|s&ta6*1mNp^t?|pqp+_`BJIvD z@z8slYcH^xwJgAXSF5>i|5Onp+ov+_2#&wdMaf>Bp?zpT!F4<(HCX+B!s_cA$7vM} z#mZniXsxioWguTiy1k?O^1rb9eW!Dvy}{O1$yhg>SgAg?h{2gBPv@`BzgYcm(!3eT z$)%bwXAeozaOl5abs1RFe4S+pEzx`IpQO3}G7%Nc#HHc;f32OulI9$@AOA_3|HbNe zY@_7+g#5m9pTxL}{=w?L3$a~y$}~B!r1|rYFMqN6<~i-OFG@0{XMOtSh4tf)mD#^o zee-fU_viXwtiIgo;`;3`R`=@a2mUK*F7Cbjk_$_k`|lAX+BUs{4G%>6AE6lM-Pay-otugKtt}f*lzf9F&Aa`m z$MYV$Q39{;PyKd@wto(Pqq<4%_CMm!Hy!f|yek$DK#<6PULFp7*mUr?^xFQlO~rfF zD;{{8{wHpa|HJcQcVJynJ}hbe;e~Z7;Awdq`iK&Hf7AT|N@nusH%bqnu@mOi;dvkn zv^@w~JxBu`Ft3gh*2DGOhWh0%RtFCBU>tCxAM{||^%Ttafbb=nTzceLdvTcZccz6X-ls$t+TC(5I2XkO#y&#Gi!X(*|BwGNKlOM8N z7&^C?&B+L-DhyBAV}9E>2%DsHbMJEMh$<+If(YPuwEQLOnj%20REW0pu)m0i2YD3f z3PKF@Z)08V3N1*nZP;*OILtvb5HSd*)?>;58YCn1Lco92I-<;gT=;=}=R0|WpUJj; zsODAd@zNs+(r>2s9aF9c%blHCh-a z;?X!{`UXGapxh_7j6IiKAh#1yjWdC4tE=6Seh9)%!}ezmz^+OicPKS^W}+lJ(+H z>?Xr~22!7XVv|Tw$oUlMoAQrW$8{tj1e~P2LjCxf8P8G>$fN$zwyJ9;RpO9Mxq@^u z69Ke_0WhVRqAw)a`Z7W_`{^b|dFpJ6h9u4WHLe9J1K2E$*hj_9L5196idIoM%(Z$t zn*B5=W5}*7w2nA;BtvMAI5H?|>y}oJjwBI)`gyk~O=9|CpyAF?^_SWVmEW|gP&Pn5 zyTF%oC=8(<3d^ivajH-mf_Pk`Ay?|`|so7GUS2FR7q z0Z`pYRP3N8-sn*QG!jEi6A!}Fg_P6@KaJ9|bJ0`0p*zb5{G=-2f!6&p9Lwfp`F0Be zowAp#AV#5h3_Y&2!OhKGg?AXKCMx{t;u?lUqsmFzWjpSG87T(>{Kj{ z%{LncsA)2b)@6`KdB)6VXK1oj%qvutBHnAM9B3&c)$0}Wa#u6JYUcm|i$?LBVSE&; zqgJq51v@=XX%Vmte!gQ|>n%mIKGJJLqlEe*brbf&;W2f#PGC!0R4W?bz&7b&HlrOa z$!ZYn=AmO8qN5zTguew76)n z?Cwz?+S%lJAItkTV>wGz({Y{@DQLaov+&qw(X5qiA)o{eos>|N!sW+3yUcwS-Ea@p zRGF0?30-|wy{06UGrAFY)Td+&ZAR^_NXnf}2Hkt>Oh48e&<#&s46?}$hXxEFtQ+kH8~p?u zTmc(MxrSv`h9jb%hS-b7=_RM=Ur!Ehj4B$A-Wfva*^E3XHfKZ|7kDR|*bSDnH+O|M zpRzVrDmS0uH&@F~NGj{W07`NqgI; zef#I8*p>1G^xh;V*7%Cq+DAKo1VFKPU1G?VCeE{@#m8aFYplqHy#EmT?$T{vwf!C4BT#7 zGdxigJGrs9ag4K>&pNSDJ_$KWi#!^PMec~%l1XH+bXc;9BWzEW6-%NtO{rl?EiwA2 zBaxtEn}%$d5uuc>W4oJV>(hLCF@7q0VLSchwDZ@g82MQhi(O>b=^}x3vWnd=G&^yB zJ0vH&)lJ)7;j@LdGl2=a;-lk=JiCw|c022KGq8_7Z1xpaXSG&iWk*|$I_Dtt^KIet zw7_%TSo^K)^USXEHc#_rtoDv2+b)&4&LzatP!2{oSF=@nx|x22ozq#l3Y$RSsIdBRk2)gGFh_{ zUSE>ftkM29O;keCl<%W5MA$xV8(sc+mofES?LEhi>oH+8lI{oT& zS#njseue*X)iro^LHK>Y%i%WA=`^qN8rkuV!Pu2+w8thw~1{HC*J;^VauYp1TMiW^Z&{AePrNp4XrV7qoBR5%aGdBb>3) z&(XJcFqX|h!}d5Prnuio2vomgsp{c*N#Z{m6MMNrQ(PB1Tz?hckd|gr5Q!3&I#VWI zqw$}U%b9?uw|)>pZ*jj}V4B=g|8YV6aQo|eAw=cs_ra|w_GB3(Ac|4c6WqtZg~kiO3UuFKC{Y?cS^5d5poa2sUCIydxWby zOcR++4gkFw{#Y_dXKH?8u{MA#MR09 z(c#a7>!XJo)Y-~g+{?%0!Bg&$zUk3w$jf&5(PtRq<@NBv`Z0v)Cy>sYi~px{sTaqV zm#>Z&rnq;6syEQ^C*6miwjA#ER6nDrP9nq~roF=Dyz~ly1t>vO@=tm}iNh6iv}U+pKKP{B_@;fh z@#rR5oJgiPP0snL%!z}?HHyj@jLTez%L*5itNWCv>N`yDj$Xa&1KK>}+;#wsnO^}4p7Xywhr0N-Fg`dAGpVk_LQmjG)sjOwN1EP0%?S`Km`1OD zV_Po;hHCl8Z2SK7*L#Ws!W{zPMKhyTrsK_kf5?IDulxZ5FUa!#?-KnSlBX2ukAK766TyfaB&fd3yFPs86-^WxhmTqR#H&{ zUbh#v4Mo$iq&cZSG0tCy&cc9e!xJ>{MUk41{-kg(GPD}30D*!*L<7jGQ7P=KTBWOv zcFXmS=MU@~Er_#Y)#o3PYhyr#2h=~c_9QYu;;BW+pxP~f|0Nd#dgJSZ@I+co*`MiP zOm0wV9FBJpO-u+Aix|kegoZStmF0{D;Ho=3R*y56OW{+0xtfl|QPDDJE7Jq;m3na` zIPd+$ZZb4+*-5|7?%WeaX}0~#j#Fq!n{Li~miXe(jZS;7g!X{-$LsY7 zqKuLv(qJr>2qtfWA_RC|^;uF3>XK#iAFH2oLlR!En7-Z3R8z<9p`f1$V}FX=kf@Yc zShN2sp|>1Lo8?Ut^W#$njXL;*9?iR#UK$QRS|Thw3X0IGhZDy(MxUQ30!KopdJoql zE8_?pfR|<`KY*9U0Nx=>BTY0K%WUIhF2xvd@q9_=4_}s-Nzel>LM$XLj$A{j-A!ds zBW!ij-PU{<^8}HSN>$zHmgM4yXtWSmvgjG`Bm&QnnDVi%R!@{nB`fmc5X;roN#S_` z>KG`aptO>lxkg%PQ59d!+$05Gy8@frqxH-_9HJmsgx^FEowQ_>?K?F6JFY)xUjxB8D6l8V?8i1y1up zFKV-a<>)x=d}LbnbIQW;EK@)~^}lKL*KRcsVFM5uKC$eK4qOY@%mPR|z++Yw`wMrz z1OHnpOm~MR5f5l}SsBtwb7KFVg6hs5h? za>%6JFj>=4t{)}y@pS?Yg7m8yc3BzXftVRIxDNPnfM8f1JRFEx$oI6g^y+EX>mk89 zz(dPD8A8%@&<_#21L2O)OB_HY6;MA>^sMUPQMT1~BXoPHZ_x4xN`62QYdH%45D2|j znAVu3KsZe5{Sj}o$t@kwq|%K*1Z)(OzC^zZd=V<`g2m)I*ocnWnP}M1v0o{Jz75qxD<_7rg}G zmq5Z<^mfr`;q3LOxt4FK<}&FIO=iBTU_X{OPgJkv2a zU!54zuCeH>(hm*NX{ukW?zpVBg;QH@Kk}#zXeu@au zKoZ67$V_YStmYYK&2sL_|H}X|Agz&r#L*eS^zFifLsQ!!nnP#m&JbG$yUw5;UgMhR zv)NJ~-=2fsYsI975|3)f0Q-oK?S>s^pK1*;gWOSKO|NkERkt=tWx$dmv>HGB{)BK) zVeWMR3c{$D*z!mO_i&OBA#?{wfbwVBJshc$0sAK>Z@9*-&6%DKX{qm&i`hvJk`|%Y zpI!xA`X#+cT6F*Z{Yn~s!UBNN(t|?DEgZ108ly!x2J&<@H=Wo+o5$`S8FaS0-!qeA zJZfTR<0`|GJj&{sRLgm~#mJ943&}yIDgRnuagIznd*L_(4`r5+QBul`rcXA*oZ2nc+571U~E6Gh(ER@lYwUdKvCyNN>c^tGwJ7tafb+Ur z5CTwzljdnYm!=|#$jn@?h-AMuM<`f?^Y);6=lBh<;|Ts7EN=@)u#Y-f+giHfRX+P@ z5$hs+K-PVjTIt{>@Q!YrCd4zn_>#@8oqYReM5|OwBwZAfZ6ASas6@?$dlY2T5Ux%` z>dVv@fWRnN4J{}YS@b)g3efw^FxNyo&>4ubvrYa1`lC(I_!>a&e|)av4It)7G7uCI z0Zp%zngl+KrIPL={NbDC76T=QitI$E-*4K)-@d990kF&c+KCs__`*FPpB^G#QbHM2 zQRz1*O8dJ6ex|%?Sm?g;)krD)Oc2WXArcW!yBRkX2`#%QK-uK(~}T}qyUZhrLA z@ZtUY=-eI*;>?_~59)Qlg{WTTy2s^=%FcR5O9jrrHGfn^-T$JaZL z?BpELCeko}zLSf&Ls?tCgZ3V~g>&=%lko$+^h*HvH}m%I*ZI(!ZPaFTKuS0ugc43{ z6TOS-1~Uv{u0X<_`a)u-=#43U5!kCZU$Q5D1F@&P75t#ADan~fL^v?=DF<>gd9b>M znSp~d5=k3V*sTfM5IK9j9m^Kk$yDQKVGYgK_0*f> zv~*6U(j1iBF|-s@Z?_gmd2e@lB^T*y-dSwY83IfIJZl6x(k3o6rS!6DXknzgp3UEYmC1mh>GfwF=)DI2F)v`wSvo=%s=RQkVsO7pQp#&!ZQ4b*^AZh6tL~W4t z24xQpT_*({pF+O;5RC*U^dP11%Yy4hs`?j2+yNPe>06sGui$Cr_vp+Qi%n$a=(KU+ z*W}g3EH(zUE#QNgl2e!qQ&{NfO|9k_Jmwhbiy&YL8MBvpNy=a3&Bpd}fmWllM0`#G-Xv$s$2FXbaqEJVGuY`v>@`ksgS(EYb)2kE`V z!K1~>Gz`LT={*AZ{B~hb)j6{KE7EaC1gx#?a2b7YnGP9jCBtl= zt@w(7sx?PGS&R-?VGe5}a&6X*9Q4vVN1C#SW=_`X0gRz%(Voq6USc->(o8CXC!w!P zyu}#QpRM%@kC~w5rB=lbSPEmd&DepG3rj^sS;|U@21|L{S)~F?WtwKC?{W2*W_6xP6_;%7+*#GqNsZlB-O-sE z5^Eup1saWiK1+T6Rp>mItMY4ocw5TyaAo6L1VTdtEwR4YG7EM?YCOh_+PBf zHp#~(y!a1R-@6!nsG5fU2UaJno~8UZR-fmq{s*g9FQ~Bp4_1E#K&b;@bHWkT!BKI- zGuFYs;zZ!DLlEagl&eEjb3#%_XLH?(jzHJ?n zI6AYiy?^|vxH`G8qJ3cO{QFH>admUg;QsNM#fSLY`$zxe9NW+&=g5ztX$5(e4TBSN z<&EwC1JVBnqL0)S_D6zf6>{Xi77fM{bK7lNVJHjx|*- z*P8anP$)K6tv1-qR~U`MHc!5}?2qLteyiDR_x^FVIsUD7yE_O0ol>c#Znr-QkJWgh z|OfH#!AiB^PoB9Ohe3e@wA41NLDaigxL$5fB<6WGTed^t;QhE!|UxF&j%?OME~}|ga03hzW?n} z5(d#*{DT?)Li7f&pAs;L-r^Ha^cSLs@;^af5WUqi(?I0ms9<{8=U)&#Kf9*Qw=BKm z`TV-+itqn~=L7V39Ngp&8}0A#Y|G>vZd?-{-QE$z>dL_ZH2^+rU#hTLZrSiVwDz#I~`ae?XyMI&Z;D4vmgIcbbK@kz-g`iJ1EljXfdK4^` zep)K7h%#gDd6Zzz0VG^5BT!P?04=aKb9#H~no}EEF`ekpZPhH#RL01;XS6 ze0O@~<2QpcYQd=xLk7?Y>Ogo%NCCtUJBdZRI%csTkmpN9$Duk>x|SRo4?r0Sg4S0Y z5-bo@Y>b(XfOxy)(v%98#OyJ=d0s4v@Te+eJ=ax>Sqh=#F=QnMqW3L^gtmYUF+d~c z2s3)2eV~8kgt1$o}ga>T+S|AFeZxIlj!v`qmg^t)E%)FgM4k~;1 z`plY&XstNwZz_Gng4G~t+{&{hA>6^xd3;qO#^amoIlC^<9*%UOpa!lk*kIRgz0>@$ zhJs+(xW8S$+w-Ay2FZ~YWn3$G15hF`60Fm&tsQbwPzlIj2|$0p?P9su+(HoRG%qZ0 z>J;9Fuo~Rry`z!w(1U_-BZ2M25`r9g-iwoWt;&kAb0j&}fH;*E+!SIO`~m=?76(H@ zz#P;V!3a`6gIW}XL4=XxgPduuEjAlwKZN)P63AS26xcvCQI$a62A0Hvd}8!i z?AOzD5LV-*O?f`+xxPqM@S*`vpa)p`z5bphVUu(h;pzQ2EoE6=`EX+H7*PyfIUiiLSiuv zWX%o3>l*9UgXn9I=8sG-I?3HoSKeDusWnDmR}f({*!T(U%K%S?ZO-`mjf-pVA<8Ly z3_=hBMi>|k;ku8gr*4Bq_h0QMl$6_kWJn>n)Gc1YiM8Uh+z$8dd*T6lH)d9YG? z7_5{YE%u%rT4{J%x=;YbgqVLYd3jFV);=!18}&2y<&9#+oMa@r_p9S2QXh7`P&ONoCCr~Ed4iZC0W+S&3?N)tGqy6*-9A$(i6AD8 zFlb3g)JkE*t6)>ly7%ml5qLktIJ~`)T~UOW-Tu>`%XoqK2mu0w@3^2vz5_M=<$+ zT~V0T12?ST&LJcEsX6)=IJd}ibP2@C>c(y}fe!wQKPN{{K<%}%^t7@aigj7BG#QHV z=J%KfvShS&>){C(C$^P4h;*TCB+$qm5AUl#i16xf24ID#|; zPt0T_6hzFFB+N7vtIV`dAg# zR&xGR7(@>fUS$(4Cl_C(kXWUbv1L|_CYKwfcw@^aHOi*!L$2CNq25ZZEy!%3Pi{FV zZ3?@Ss1GqZP1I~=6Mv~IO?&1AD>Cbxe|^Uh57)=yvPO^@G8?{-c1 z70d{0l@2;hc8g|V+~GBbv0GTUb}k}@;1-bkdalIPkoLA3nT+!!A>+|Zi$097YC7%uDDCDO#_cDX-Avm3=vT|F9LK0x zr>CrkqcoSOxxIu+=Wm$4pEBI*2mKIadOUsgRG#~rgy~l+0~|{d-DCbA!rV-*0?wiW zo4x{4+k!sSLI=9S_j?8G=7p9agz7?IW;+wMurD4N7m71LMO!)HO7(UM)n6pq*+H6$<%)_Vy6YrH1|j;aU=w@1 zca=Sc?RWX`{E-OxE)E3?fEs=UZZJXlErVl#Zu!5`XjLw^y6 zpQrd`lSxQ7#;v#XH&z8_7bTBZn;o>I`L!0~SKA1+?!g{~zgiOvilQrP9?n{;h1zr@ z+cwJEnsB5`$6JZU+R$0r8+O|y(A%%xv~#>~Q8#Oks%Vcw?r4o|f8K4^U~L;PVC+CA z7|O03jm@7PFYfzAI$7B?3q_A#w$EFwtS<3uANkc#Y|y%g-gdy+_>9)oz}f{=@46Uo zIIb*Sx34=Rle#qMZh7j;ChIz1@9ZY)mKN%yLFuVh@60&p)T!?fWA3Sv=&^9`K&k3k zsqDUM?}nbIg8YSus*(uEg%^bN)*;y=nmHfUmiMk6}1S>sr5u zJ7~Bu_@5BnIBrnNY)HX%kmQBvEjfq9Kh^a2BE#+zgEr*&UUB$#9lb-dLvU*Us-}yK zgk22yyx>JD4GLVyVqx?-8UDMP?wm6sYBnnUbyz4a>%&Dq!fk&>2VNl?einJZ&eMqK z%cz*hm|*W1M172DVpP0pO!Q)m-)vkAZrp_0d0oqS>%g%@7ikwBE=7+6$IE$aK*@A> zxPc8^&@rTgK3P&YZdB-c(C4~YqN=P1>LUlhCS~^CPf$J*Ok9jkb&SnjG@UAuE_4tO z5&(#c-N}#wKItU_W+t~gCV{i=yC@z;>Qm+ZQ%xOH*}>!K9V18^1dhX+@Hk%Li^^B> zi65h;M_Z=f>3Z>>5CA6o8z=gamGP+9$AFtX2Fc-u;XZe|&{+hDSvRIx+k35DT2NwtZIZQ+Y+$e%X zh8BeV=WW>+?J3$BH|7nK7ZJWLGH=eYRZpYL2KUM=X&Mo$PR`n@o9|d527!PfGmB`} z|EDJhDHGZSL|I~z>c$g5a{VH!SKyOZ)PMSlGI5BPE!R&hTS=^5YM^*gOd**88!S2c zqSgYd*AhFegLC_h&E_7$O>m&q-YW9zY4V#_NG1Z`2*`e;*zK+}%luoCvm1f*uiyS3 zlDwRvmqVoYCv4#s*(|Wkj9?}~syedQVd1!XE`%5`Turd~d(%YDA{NYHptd6@ps&RV za8}>u_3fXW95H+yQ(X2AE@>G~B~C728j)k2Llji;)19THxpH%?jBV8hZmY@~es2x| z7Ym^IPY#{9rdQ;0LkyEp)rw<;X*nujZ%-g{oER`UviT|jFZpuw?bd z?iwhTxA9QD%PDeT3YX}_m&h%*_vUJ{mz|?)#L}3M!}MrxT$EUIYA5S>2ZS{R-R1g# z;S%6_vk!TDT;9Hmx;etNF~RM0xSNY|K*4du9{e!;p-u+$0ru_$**4AFb#OePbL{ks zU+SDZIW7XwtAGf+gArU$cT-NSs86sJPL5~SLdXukk?(7Do%k4Y$bu1)O@S-%AVUsR zq}Qm`HKz#d=XzuZ&3dsQqr-P4o+i>rUPf>qEt4RC`ZQ`GPD z&MvXKe;Cc~{jH#X-GNom_u&yyu}HLDr7BQ$+~?K4{s)t<|E-|k>+arL!ae-0pa;P! z=nss(54#fQLe!3!5XYsG$1F_O)fXpbDko$Kr=tibSPLEC;(7@04CooZ^IT(2bRPTf zo;)poe8w10X?q#1c0*2lPFOwm+saXt_*2gW2M!|$k0`FWc9Os{j(<=cdsqeWEBx*^ z$1ge0VD?M+%h@sL^tb6mlAwG%W|Zjn;ckm!o24osA)*K|6n9BE_pg|M@8r{@1OR;c zCDqcsS^_lw9=IYGWQ?R=W#1otzdrxzeKfbbr`rC*F$vj6OAq=8B zZgv?}E){MxBJ8qMm(@{YawC++1>54-i~wlKjy?(AC`s~2ppsd6(@>*DGU18=tCmfp z!x%79pkt@|HJWXomGisM7g=Et-KhQkx%AF{t;um4nUn0%X{%FneXz{no8ti1Je}4@ z!JFY>yx0#8DK7E*QFs&!h_J=I_Yus<6{g;F=FFsB$MF35#+`QMXUq&3GX+6$3@Uj7 zk@-|H62Pb5C{a6|f8bZ93zTehw6;*zU#WXgNV`|VA z^7v0+k6cLiIYZRpY)lJ?Q>&&5wGi|?Xh@Ll01IKpLA}&y1wXN4Q+>x%HO%r!nfM-K z+F@|KaXh&2*ybnihz{mq(Q0BFz#L4@38apJ>-Y&Dr;gqq6%xj?5)_IlBwwb+Qccc; zAk&HFspt2d{z2CN@lcml(RN|^n=)KbsN7ZH+qu;YUm>m_0X_P~LIwoy_eD$y87WgQ zS{Y_Vq-v+E;z<6L-%LJEzwEDsli)^y!;z%C*V1|W`{P z*TasW5cmXbi~U%9Y)gOrPMPjF2-4 z1IWbw5^~(P;T9G7#-x^?%=n^SbpsR)9CEFVYYGRE?UY>JQ=~Y6$4KiPz!UJ>RSg7* zL&9#w*-IU6W#5lpYLsmY_P^I;l4ZY-!@>sN$wTSp6_f!~4ABBw-6yz&fcER^SX0|BjiVBq9V>I18h8F$Ge|%hxnMAkbPB zh_C{CSWRCCk%yTg>7wb?{IcVYN=tqXp9Rf?h^03Xh+bT`szp)=%DCTUk<&Bq_9Y~sTC;eoN zdOQqTYUTJqpGt9wVJ~vlb z$~9KC1pVXax6ruL;pf@{b#U!1BT>zKfA}(QF^&qvq znLR<>LqrPd*MkYpa{bNc;~f2;2OlJDLC48+sn-(4EM$FS!7X#r8o7@4mSje?U1@E{ z*;gLv8U|Z7AG4LOj~KkrR~sVcArfkg!keh7TPXv1KNn!<-dV&!SkeX4GS!}%*+##Q z7TSK_lYf9S#J|GQvz_6+)9p~|r&ka+6TII8zaAU~S&$(&H-{*j5^ZppiB zIfC!d;5$Tq++mhErEB#g*ZHFra;W}vZRU^sr$K88?AV!bXk~8hg|&1(!%RG1V-Yol z=^NEGwn$3O|Ha;2gvHrz3mPt@a4Fo~9fG^N1PC4=xO;+x81C-w?(R~!YY6V{7A#1m zEBW_1XP+MSq$hh`^RKS;u6sTCY%fXj&W{=?cON1o$d0ok47wSGSxZfE(g}48enftD zkNQb!-;`p|USj25<=$y;e80TVjo?ueDC%HFu(CKL=TWCCWN*+sJUA8{b3;#m&$FJJt?q#}b$GXYq zbG83KbiW^u3j<fFem1n4zVW1A z3ArB-|9Zrb4Xvhk?@eSwtLYn;Cx5Exm@_$lAo|en=iBbz3!59ie;s1r`B_~ojF+gQgfBz+#e{A{ISP#bs=^50%Y(i;4Ch5`EO5YNH z>##olUFpmf>3lHkg95IwA>p4Kx&qXecS0fh;gfVOXL0}|jLB%MtU?Hz-XDm*_emya z5x`D_q?1A?wM&Ad5JEoOuc|e$c_Nbyh2;t%Ob_(jB3W_@P*^^oJvXpsKaiCIe8>s> zHA}2ailoxf$+tRSaoTR&AL0jXv@I5dGybvV&`7(i$l%$VK}Rid3x`Ng(@g46&X6zC$nFh=4Uzse{G zILPDl03HYfvKSSN(u%&R42RM725Lcz=>7rFhXbGCL@ounJcV%D5#oG>w+*-&p~C`c z3K6U$$)DTep9vD-6+`FbQ~DK2K8z%hjAY!5h^>tDp^j$LjwYUrK!ir~PP+gWqeahx z-S09I?ALxy0{`Q z?l9Jv(AE;s*xbS15y8}1plqG4O!2Jzd1ow%c)aUWw7_4SIu`S>2J>nb6Y`J@Xq6T= z4S`dP0oukOZp9BfAffhv(6>OCN0lI=Sp9_9-nmzhz5+0~L!q5CQW(u=^_9H9*7(Q= zBoUaxiG~Dmap3Cg3GGNFtMyNdHrB+acxr=pfGflmSL&l?cgNRs6$h1eY-JCs&9 z{YrANQvqHSImE@+W{N>2 z*--%6I1p}vI&u;cAbC117uhG)4{Oe0pcq@XNf zMT2aT5NS$4^;d=n&KLD6w`tY%X#u4yfL>Ni0!2Dc$YE+$J~czE5J}}0`32JqUStcB zs>UivQweUik&qA#1%TcrEkeyM8W#hSf?$VG6`R+kSiG9T_s*qwX`?2aUB1+uu$_rY z%LkO?)AOjDuk^M_=Y{ky&s1IW5shGg)pObgesA z3X@)qms7?^jq;~fZU04zmd9)W^R(A!EG%)z7PgKsnU1+OzvY)HS6)df ze&l>mP6bUJE1elN1MFPrW(5FpS-~<&ZA}M_qEo*)6SAPwh2vS^P+nXg#av=74iI1f zq-Y@js@%NBbYZJv6sihPVE44F0=QHGjTY@lmi);m{3rPFud1A0slG?^3CYw`6RN(k zEA|X4em)KLZY%!0T>Mp&J*cD_(83Wbt7|K*A79xRr&^O=$Xw(uSSY*v%70lU-9Yrc z!D-oYiRyeFUPJj>O~sy6&5vcI9Roz%6~3R#@uDlWFBx@>%Z;KM&7I0EmTx~RzHKjD z;cQ>oT3Trv2f-P`dw9R z$!Y`c#?@ZS_RISBJ!4YZja$oix%R6+W#1h-Zu~0T!2I;?;foP*g>m}IyOXmG-KTf? zH^$Fv^)Lt>069VUK_eif+Y-|8(P-&=wvF`{_`5@S{3EHP3!1M+zZ+<8SZ`mKa7k`zvx zR6)uwK(lX#X0%n11bR6sMtTt%dR^wIw;T=IS`%iSiQ7FZW+E@!tf)Kq9%jeHJF|FZ z@~7Lcin@6A2Y4av++WoN5mfk{#Dv7uM4VJvgUtExQAKr(#hT2;F%0R*clY3SyHs|` z-tMx{TMV3;GelT`vUcSmD@yF`a(sUvdfBuE%dSQHlSLuvUX7@Q8rq&3Lid}ZPR&VU z9UaSC9t+7R%WgMIoOa9G%Dt}9y;aq{))UJNwEdllUem9N=0Vf%qRjNx_gvV_ETe=i z=oM`dl&t8*?5Y$T_&6OWMQog`ayP92s0Y(8`^VS&l_b`NVh3)@+y<;SQ4ft+4=YG)kXH}Bb*<~O?+02P+AAH-2_M=; z9pb0k%#|NLblMCD+HgJ})~+0?k{*GXZCx>rK8x8JtJ(fMv%zz>VKqDw%Q)&NJL+&a za_h3)9Y5qhKT5va%qH*5jAG9#+Ox*DLmNMG<~uGjva7PUOZ|G>lWE6RajX|*7a?Ys zQ`B9)-da(mTt%-^oitWZC0gSo)v&HyhauAR)uJ)zD45T_wyG#4OR9xWs^k2)HA}P; zL8{xzuyo(P%>xyjWYj}{3RaWs+vjSgw-}t1WeRX8XtE#ia1hUO(3U;zFIw$c?--xA zgG@%9V!@wP-#W~6HH_hJes}7erFZR+h)V`5(euw0F zqwww>ZSswhys}*Ljmm|R!orQ(l#x4H~m z`WO3^s_t40#)8GSHI28G{kN7{?s^Muy3V)niY*K{JY>3WUvNA=E%jP_d#}XjL4|f_ z6g_8*cxNkaYT*`-~lE)8aU%s!Ci(ERPr&( zIwXT4Boom^>4J11Bl@u=I{I=PZ7Bxh7t)v(2*EWbS>ji??#J|Eo zALm}6fvtDLqpvP2)x*+{1pNM{ESo6r|;PvS=h9eZ^3 zY$|m)pbx~NJk;b1#P!Q}{;#+1e*byXf=2=X5a1bYVEzDd6a)p@%Ur}D3UW;cZFN{! z-xd@;FRA~jrqe3L0pHX)99`3mr@Z690jY!AlNXE+3CgpLx zI-CZ`e$%Wph|B#^Ay5mgrW@ec`uJnorZ5RuMu4Gh^Uu(>xi1*nHcuHJP}lYKYgh0( zdmCT80j6(7VgHO>p$7;jbixXG*xL4sWRhbQz}m%p4g55%XQ1x8HO&SS&hGfgb3Es# zSk5kLGCEC1K@rRYOy5d)W6K)&nXH}nGC08ho=mNS<1E;gungH{Qlw&it%#NSEiS>( z0!BrS(fmT6Pct0Y$#|&pRZ57dkVwhkNSf+U<4@(>ZO)hepUSyZY*B`Hn5~Mh*)emu zUGElE2z8tdbr^8KcQzRwIfjAp8Bn1@YiK!ia)xatv9hP7X_yn6CSF>Q( zUTL$W^EYy?35}eK6woX3M3DHP;QGFeY1vI1bF5jvR&*$|8^x-6Kh30+>AsknUcJQZ2F2cl}})&`KT`dnQu&ZiKH{4SY$vR6u?I%r(sS@wu1)O%)b^jqomlJs4L& zTSKx+M9WQ*p}50l7$ut2vM=6A0glWn7wBUEtd)($a30`IR=hv}IRp0g(ZG``cc(x7 z{$lbRxkBCrDt%V$9t1?6%Q+}a;#+aNZ{_PW?^mBjmHrbr7YU-9{WnaG3rESn=CO0e z_d}ciV`C1-1>?Wv z+?Bw<1@^>%q+K}s5z%@iX2=kBe0m54pQi&!ypRIC0Pd(CJS9H{p9)9R6^kz32Kmqs zktnDo3uV-z`*eKDX(F}BXQvILF67kXh`Hy?|KD}1T= z8tUYe0*EuYk;aD>HQk#KGmD^O3y%Z9E?|7IImir?r0C(TjHU=uz_I$8JkQuZ17M_;}07Y#)P&235bFhG*>NQ77Y$zK)xX ze{uBXWyLn*#2V`sfwF^G4Dyyk)7$+_WSlzRPUDqylC=h2l>I( z?uO>$e}i%e3Niq!>S_SW6r+VgZ~z=JwA3WBSz>IC1cPGY1J`inN+*l1pnaTOokU+@ zc1EW(Ri-0R$ji%P7=vC7-CAXKFBRUKl&_1K0|H&E1uU5Xj5&QJT0XFDkzw%klp1wu zgB7B=xyq)@-}|=lO5M?Y)HV$C!=8Ccq}h%&UWB;7u;5blMCe+pcU6gnd$|#wrY5op2i2b`s2?sqZGFm+XnE6z6@>vvOVj9(?F-_N9~61o%|btC>Uv3B4`j zA!5N9?rK2h0)|=6?`{STc!X!*FheI1Wkd})7_i`}%?k^=NlW#(Z@z)_~UCxO<&EB98RX+l~tn7l2N zPAQq)u8-G-KoeO8WRDP7PU@HhMgYU3n-^-G-}Q3(_n;%b_taV2DQ})>_Avl$Tvg}M zHNt>%{NWE}I8GnyQNd{9f}=lG4|7YgPjEaf6mZD^a>_=V(NT~F33@UgB?iPT7L;J7|Gz^9pu4L2`p|BHVZYz(yVb_?6Jt(QPftzhlbY zW!`Uu-*jVktG+?>b=(3fphbppXW)S@lgh8vjewNLjoBQq%wOem%b|m`(c^pj>9*I32 zsR|J}EeB^bo|t;*XYD3xobeMcnQZ?imesox*Nu}e?;g&!aAtLI?I;ISqe`gsR}`t2 zwKEP0u_D~56l@GJGe7{BsDp83w^M*L{7kf?F@^WQ6uc?`H;tr@g5GLtmNgC0uYcu> z%&dA^Zlq~Ks%dc{r7~|OPz)Ub#f&Yg|6-3C^5a)HnV1IotA6Ckbs8x%mZTwHm)Efx z^3^~yK(8rf)9Zwu=;!I^7Yj;-h}V({Q@;vcOIjGWy!iB3fX6aSXG$qyG|T`I%d9B5 zbU`v@v6G|*Q5b>S`yVEUQmIdK%p^<9*0FX%_DEPq%}}#4*skO-SHK@Y^bRF{AS{0W{{N_d!ck5Dj% zQ8TgAmI_(`Bnl#B@)Vtnx!jb9Dlf$~Nd%O0@PMjn4dzPSUQSnYqg>j#8GEtHA)#8Xbx0Ho{e*<}W&v z>sShy*^bqH2J(Hj2PNTKbhsKlt*{*XJHf<;Ez7n?BR(im9lI0S_lKK!_^hw*JP@$97u*i4D9z9&AG zB;p?>S=lC{lq3hqCj^ypyECQc^(T0YrJNt6T^B>*pSUs~kE9GJtLOk7qb#FWx>ToA=v@v5|<*S6GqpmN!+(m=K<>!@^+`PUh9 z>fLetvmHEfc^LHxWSxnn1_EE7wpw48SQBL1098rewvBuzI)?U1*eumnr=j;5lV>^!_Yyu1Kb=nnwzfP!$rcMp#yU&6!t{?k4G4>vFV4>$i0 zH^1B&%YNP6_44%a^JHVHyZiTV00QHt4?MojrY{nG$)+C~-{Gb|NRDwU09VImE0EBt zWGjf&<8UjOGKg_Igf_`$JCw1gWIK$t>2N!obC7W-f@j`lCsJU)WG71G?r|g?`St(U5;rlK}*MWFHz5`bT7%!<7hA0B#3E0#UjaeKh>tFbU)3Z z>1aRQWsvD0D3TrFzfX&ZL-7l2xD=@^(bre>Gc@r5bMuzo`rD(fWSe;&qFRPx}m-l+;HQX>j zLKo;wSh^fAEE*5k2M&|gC+6vL>~;4GoFwH3coXF8hmr%4nlA&N#p1#6C{n&CHx;nB zoC`8 zQ9=HMHB>r)S@;$4c!ZW@zJ#U^Hy&C) zjN&-WBq=3GW?Ll`{+AhmkVsK9EH=9Pr#T|(LnGY2N&qd7DL{u4guht#EoXjlUD^c6YJxxBy36@UbfcwgV00y!xa;9T(i{f7b8=%8UvXvxW+lp8QoVF~CJ zNa8w@(r_Wfh0O95rBmBRqQOJ zfL4^MwJ$@XF1x9NmYsV^&8L%_*{?$q$2G=ZXd5jGeg=jdW^*tYUnWl=KcA^8$4PAjj|K zD=XLx%>>JA-rgr~w*U)Ly`s?yN;8enxf1@PJi0K6#m)oUl!n0K-Sz5GP{ zb3(rrfzi5?%M{L{ooKrQRZQ%FQ`L@shc zuWpuV;ac->a?t=xnz7$#WVdNT^R{p%KE6$MQqNTN(6p5`U92haf0D zIXw+}gHw_1*Es-Ys(qkX+Xvy0xUUmT;&q{2E-LqnL zC$~=3KrqckA5?CZ=-+EBrExbCf1@-TAkq({e!vnH*T2|!eIr<>N_lG9^%-1q`*HB) z^7k+67ieny-)J=d-nZaeU0+_kz``%J#kvB0x~KBqT-e`+@_c`Befu%uSjz9t)bG2m-&UdDQLo?amftLlKZTTkPoDozQ~w!XfAU`cZt8%mE&pkl z05Yk7&b)vN(|{@80Mg!ocIv>ht$<0GKoY6I*1W(I)4&PeK;quOX6m4$t-x`Zpn5w0 zL#d!c)1Wcmpti!GgWjNnt)Nku;2yf*eW~DmSE2Hs!9Ii`VST|5k|DKbA&{M|V851- zh{X_R{}A4i;62#Tt=y2Pzt`1GtzF_2*b|V*lS)GK1j5RHhF+V7mHUOQVTBbehE;h9 zmMsQk3b5C0VbqhYN1~dU|u_<+X$iGLSo)&q1)4=KUics3ZXk;q(3WRy3nJ$dZ7F1 z#dMnzn8u5BKTP+e!1O{GoLU$?>c#w@gp7TFGloVrf?%55jZSNMLN6@ zMgn9iWd2yp*jSD2*ihKGH2hf9o>&a3I5oexpu9Mgy4cpaP}WumEteo8cc}|)DJU8) zp8qIPIMh~DF;&DkL z(omxQcAS(y=nWICc`1YC5rqj6kJ(Y;<#5uhThjDFqD*~~-p3FpA~u&1iVJIzk4rRP z^clV_`FbiQ2M7lF>w5(Y(tRrR^DU)`WMYV3@(WE(bSFw(cwkRbqzKnfjTdA}J)+P4 z7?vpr`Yf0hi=F1+mv&j38feQ>R!U!eL|*X`RQrp%@gsfnQeY7>pin=#CNBN3C0+GZ zx)f7J6l{itUxs5#dS@uh=uy-lQ~dZy%1mhN4@K6grQq+7k<_kV%uC4h8;a!pim8(y zGyAZ!LR&H`^;r&==+5**j}_DRiQ;~?`rjfaUg>A79Wh_nM%^pY?${>&)@OVvr2`(5 z!6>D{DKR3BMxheZA~S=~i32c&0`VScutw7f!V*XfvYtjFe<@}K{mPAB%oXX46;#Zm z7Zjjp%B!-?<50@8^~>WZ%@fYgNuA4sWzH{qm8-Lzzbu&#|05k5t@%=rFL0bYgOnnh zmba>(0v*qZq%lj_#d02}s2b$IX3iEgD0nO_SoA6sjLUmBT4-FBqc~b<5|(NfMq_cD zm+-MjF0IItIA2+b!MQE}15+`vQn8B?i*{Lxqjv;^wX6_*t3Y!(gT}k~J$1p?G*C!c zu26lJk5Gw+V4>A^iKcf+5OZmmU9o9cX^&uOTv)#GF}E#oVPRWIt{p?#acKccd2Csk zZ(2|uvqjSAXMLdpQS-7|gOb|E;(E<;iqvw6CW8c_iowzBF$3@6GU)KFsChZ*yApFh z3f+Q`!^CpQN?O=jTImJ~!%|w@R$9g$O4@-P^NyXXevjKPuF9+SCn%)x}WP1@}PejJE1}VCn(X_5PCe`lj`rzV+TmwN1nI zwYl}}Fb$7X4PPW1-k3Ht`!>Wu^XMZDmWTB}fQ>rG4Kh~wn4cQ;%6X<08|OzFKUg*D zlQfy3^1NMPR!S$35o)q)Z_*5>v@TC|v?t3>b91$)bYAgyS0;NeTxU7P>}gN%$=>7R zSo2rmmRYP8*z4w^+?I0NmfFHRr;`?~qsFk_miN9b@hi>iO06`lg&r)e+^B6zX02|% zt+`{ZUzyqzrP^G5TOFR-?8jot>=WwSNvlxXThbfr!rOv-+gx1RTS+?5+uN<)wkHEy zrypB8P-(i#)5pfDvREoY?K|ooI?y0Wox?C4vG$#8vmM7st&Mr2~w% z3dVQ_gGhU@MS5@zd+s_=aytwnd~RzhA4C}+L`56Y z%N>$o9nur&h8Q>uAx8|Mj1TFU4r_fLh+f766^Y}_i$7aBX!~%3roBXdn&BmhoxtHs zcMSNmQaTzA2(pZJ?+t}_;0ZKw3pKqXob!lc0L7C65>MZ=Ta5^RH#eRc@q0!L$N-0^ z;B|N4$!Fm4-~#vptOVhmT@E~IR7MUwLH6`Yj0s}}8N+C+W8XmInza9phHf)Ro<0w+ca#~$y8lY}a-jk`ahN7S2dv#Wh8hmRxJ+Og z4P!+@NN|ksUL5eA>D3?}lTEAKr>kZ-1QW0eL#UNR=#f)QnGND+By2`_WCtn~4ATu6 z+`KQ`{Ab+M#ouWiXJN2Mg^m0qMMuM)Ck(G<;knd^9jD32KK>r!Uh5yxRh^;h9JHlU zfLQ(|<2B!YTmIi-eb8sLI~)8nf8bBx{U+7Gq5E!DIXStyOj4;X(5H?<_9Nj7eiFJP zj|);r40kAC1wIxy)(;4CfuoH9d<4Mh01&OQ7D+tjC6yQbA>|)g20rp?!=R=tjy;c7 z8BK#cj;Q(9cWcWL zqF+{nb&m)DC-PII#zd&bOZ%#Jkuls+HS1agfM}DgJhsL0_AN7CJ$?b>e3%XV8PVrL|G zx9Z-{LDzm6kZu-t%=D@tWR*p%!5CxMg#Cv(WEUcy4@p``3sp58Z!Z%=#bZ1W~ z>YQcC9W#ZDs7*RJviMCW1NI$>1RfmQ6v>X&IGuC0Wc zqfGV##>~S=EYWwA1kAPes>p#H3_Z-1&9_5Oj2sx#DPIjwc9DQOx zaveHGGW{e#19VYG7E?!93pzE2Ii}J(ZZzExPCtpB*`9HdX-HlY#PQM3ffe65GlMy2 zvN?ANKUsM?#fZdDis4SKS-0!rhCu@SDUhrC{Hs6?*2@+<`004z6@Kw9YcRU&!a5dN z5c>U)yx?NI%2T}Za=I!JgZ!zGPtn38F%Xew`){j}>^k8gLM!AZ#~d5Dhhq5AIouL} z<=B~PT$F3s#Z%)e3w$c%bbuF&BpmnD6#o>iAP2ti-wOGiHjzYj!0X@jG8Z_PbnkB5 zZ`~@FDppNkUf;p+nE*XZkef`Nc|nn^rr#>}@ta0~J;<@s$a0&=piAVOO%w6j6Eg^f zK1JYLOcJhlINx=@oEnb-)Xhcu%*5-L03h>?`v+%CKxqYcxyo1zD~N?s=@%WYALdyA z<`p6PO=DD7@e7XpzIV8VJ#LG-oUR1S<{#7vR^=W4Qk%#wC7< zYCIA`zCDhr9TZMH#&}srAYLv4YcwEVogTKO&Z~DUZE)_NPINrK`Hq5pon$* zqVe!h^7upfWpLRx8y}Dx^m5v{b}jSaK3P) z284ROxzHFmsO_>=eODolPBn}62(+h^#AehLK=fu`B@IXh=?SghSIhd#&9zE~GX%6T z{>9BRu|*!WjKB4 zoH9La7?VL{DX_U=zVf7B8D;xU#;d}~#P7W88KJW;I37mI{Lpv?2ePjaIV4$1_~}A8 z8Gs2oc{epaf%%>B~kAzzBp*sfHi%)GtX(1sR z!4CET1n3YBCoqYnZzu4uVmarWQWvO;jJTDli+-Xjj?ro*9?zt^sPg};vsjz z!J=9Rhcud;N5b`{b}olDc{0#_@IoiD4++=PJU$$&kj{TXm6qORx3*!&UBLs(YfH%j+0vTNt{Luv#bKrvQa6tfAbTmqT%8zKy zYTCMu>}opi0&kgV-~3QgL`kJZ!nl#*Eu9vJAt~(wY#+K+`rV=CbO%CEDJ8H~-E~9lom%*V<1<%j;+NsUH=;2Py(3OvkWML5Ss7A@_fBpjh%EsLT{TTE1?RY zq*kB~U}Sz|iv(>S%KJI*x1Ge}-U&I>QdJR^g*2z9AP9kA4Q!-RJw8zuU}+NX-lusW z9s7Pr30WXH9e~k@wK1{eOdFCj%*nV|)u*fjy(+hB7lp%TZ%xYb%t=%xFX4y)qWaYM zhQkWGe&1t#`S62C&241xgmPikePdF@$#?mMaouHkypX4yUiW^z`h$&<=|!K&uKBN@m|%5z(Mzq_sUk55^_%2w zi1yoVJT~E*-8Yw^!4Tsee79g(V2;M0;Q-{%bU>@j0~Xm&I)D=%18oZqLjz~*;`kSUoir9G74OKJGDNhx^KHn$@}qA7c+b$*@GgDjZJDaYM(aPuwu??+st zqHm&5s02sQL^VW`V0y`U`hxfM6lHXH^eM!b(kPK&5b;9%i5@o*cLK4)f&YF^(T|}v z7(SR524L?ai);p=3KZp$08&C@wc84cLe%g=LZ3_rKyJ07R;NL7^%+C(Os{-fXF0T$ zmqrcv+A>&UQx8bP1ZP^+^m|@so@VR_ZyjX_8P~bmnZKPbQ^d~urQxKwVkMbz7vp#7 zX!jK^WAnp@{*QbKOxGW5WCG0;Lnm?a@EVmw+qt>tS15MYFjgj@Cm}_pmpf^B;;;#*bc89FLE1VsJjK;7C2vwvQZPr&Ci= z=5zW;0AF2(Q3EC5v0n9{7=x&YD)teuW+f|mHA}1=71d|jbm|4M0d|)5eb5$9wvCn< zb($HzG8{ySvnwtrXNv{UayU>PMT=zqtU@#;5W_=l5h-TIXhip^i5jg zl%Dj;Q~%IilM`yaUQ0IX01gL3bZ4&?vOAYRMph%#;1nrTzS?8CjP07rlz}7ot8nG# zZOB?iC?iwHQzl%)ItSLcKLLfh9P16glUjdIO`SZhJday=wi3Hv zn)-(DAqOaGBSo-09W3`D53kck?mN$vr&VGm)dZR1_tshawfFhZSi_`}Vk z1fru?cNyeAjvjcrCN{6`aRdt{>XX0!+dY3rKk44}KI=Y1ithg7pYC}KT;^YHj_35@ zFE`KT`JO8V<>p4in$6zxja}}r=9wq&5I-%Zp19Zk>7ElXFa7PFzhu~X{^jOBdNTiV zb1W;*zucVT=lEZ4ZanZWZtf3_&j0D2+iw5E%?Yr#|8nyzwST(j-cxaqb!hkeMSU&P zdmh?7r^|glu@wK5HRReb;>}w0mB?^XU&aKf?cdop?dGGDdha2Ib}> z9yj~S8;@VAyVA11eK}_lf1-zcy&ssmyZqGhyd&SeIQ4Dows_;k!1=fT&hM{}(qACR zUEf}Ap-YyCEx(@-C9EA~Gu+)AhiyP(HEUD8iM5=*~FG>kf+#Gj0$ zhZt9?p}i*#>^C)xMK1F2fM1*le z^dHa+T$pQ-lG$ZKIG(FHY5Ns-#T659M5IC_a!B({v7tJgK?aF2LPoHlUsFU_xWZS| zC4{*oP}M>POEOo3XF#7vQkgamS{)BA0U)^!aC5;Dg}_V4NWLu?Fe_+%)etzvNfQgk z`vxne$unqEAjHz|Germ=XCnvWEo_!B=u{x#G#6_S0v8OG;b1ulS2@WWC@U9YdhWwd zjdu8)>lh&C(J++rUY<5o{=?j$X~obd2)sfjw@mockPpwWIlMfH%CNu1@HY~L3Gd+` z+|Hf+;V@Ex173gwXk=$`^*j6UU2Fb+h6 z`8N!%Bn+j7RERVcvTSUbd}snhF_g^@+zXh-RlC9suu&0Vim447A2)0nt58wOAFn!5 zO-e~|y((c-Vd_?rUquFZ*)n_A5_~2K`Er!}Z7J18i<$Y7q0VO12*X6#mB)&0efSfd!)-=FyTFb5)al6`?L*i2d$HnK|A!MIn#i1_j z(hsL8Q0IS(TRPF2=Zr!yjg|RjOf4`&{RO`IxxW_WHte@xw20gIIabKmFwCpkXfo_l zDWz;H{cLD{9lll#V!?&hsP65j@o+s=?3c^%OPvIJ;+7DJ;?)etOfDBwd>3opii{vp z=8SRq%-P&@`2&T@93&qGea1d5(-%-cDVlAeI3qI~DJwPW{CSp+teyT$fZI|ICawsO zL(dEyA<~7ysZMVjPCFg5Aa;hhxP`dJP1DN0d4*Ra-l;A*P${9Go;}0Bk2mx2nV}7t z(a&Vc?>Jrbkwi{|F@WT|*BecVNHnR5DiXHnC={P)?APRUujM*35XEO` zR)_0M=MHuL0Ma%CAgrX{EGQSLv{tS3y&csQD%3J4)S*_7OJOspqcb#+@tdv$Y*v2a zZFQblD4y0!KU%z8*8PpT6sejKZJ8M>`zpRtIDt;TR%5Bte5pKKpCofB38?FYUZ4D9 zBu(^9Mx%bitiC_;a_-HN9m#U`S!li`Ro1}kqCJUX+2uihgEq}&>(%)ZI&f)Zd71W5 z#1DgtK)kBRhH75%x;@=`;0mX^K<&U}x$0YnM1iJAh6Y*o)-P|_@>hz--y+n%jb2-6 zNAJi}9qGPR?U`uo0vayT7>*gPo;w(_e_HL&%xa7@1XdW9bsCPWVe}8^$B?J9766OaG% z-rBmT(UvUqWTfIYn=z%d5zOcH()hI>nd^&@#!v0*`x8y4cnar^ZO1 zIYgAcN`)~=oJ>xFd2nl_emie$8`5bu5@*)6ww>~{okzOUOV{%%OOeOJkRfZB^V}?1 zeW${5XFA+Gw8DHW(|oGkJZROt*OJ;7k!g~bgJ|)4NGNKN$LC&6RObUv^*wF+Nb~ zvhIwu9$c}ef{KU9gGf{xVpf~Mvx5QQLvubWZM8!e{90cRh0uMAu&(XED#nPx)!?AR zkuTzrI@VF=hvxv>7(83$CL2=rqaXv@993I)u|DgBlz|- zal)ZP*zxeK1S*HTYjy9{`_mq0oHP0h ze`Ah$J-0HJUGp91&q-52efbfAW?5ICRbTQIh-cT7Xva6a0-}vjiXQjqpc)foc(E@$(@Y z=MV2qBrf)GuCIO@T#2jQ#Hw6NIXlT+*htzPYz+>}k>1Md-N?SbJ-oZwE_ZG$bXI5v zDZSs8d9N>KcZ-{No7;ZN%IBh(eXFMDvb}c8B7Uo}uib>ecV+1PO6g zRv7S9qygl>gti1L5hMIZtQ>Z;#w`fX-)qY)=*Vr@$IZOj)uHQd&L7r?6inLkOC2H1 znVo!&B{stC{zaL4T{!5Grk9RKP8>zXg2uM-qIU7Zsw2Oylzd&2aQC7GhoJd|PVKmd z>N=4U9(@^?>kVeL_+s`1#qz)T_>ojzG9X|4ap~)Q4aO1&5qN+Jg+K!Vi<}97{*Xoc zC1~3n722cPq6arpuoDr08`R?u8lMIGW$4{!4&9ezxVggJzUc9-T&O+}SlxLr#0}~j z9&7->tB3Xp02T#{f2my=FF^DwJb9E^NsxQMf&{S0nuy9u=3@Ehc$9ZVCM{hwUJ!IX z2@WCqEmnI@gTB`N`tnuWGhW_XSuIoB{soZ(f|i559K@no=-1yPY>Fdn!9%=ay%xGs zw&<8?vz_YmEd;xES zw~w{CP`c`0yB!CI#3QYBz>i(Ne$Ze56af9dy5~oiEz| z>5UMwV!*p(h+$|5S+U?j1Lm+cM1*xw3d+e09yY}F=K>2(Ub`!PT zzh0c0=u%Bzw=FzyROjqIXL=~^){!?wERP@nl`4eG{c{d-T2#*DF;G1pfk+^BuaC7J_M*6C3db1gIGzA@ zidf2a1M%qqAcy&9`!|_MtCsMy962Gx9{0H(L;?46M5VV5#45-OeuxsKVI~S;Zkb$p zT5z-A_^*(Uy9s21mJ$hYf+z@B!a}Sscsxc}2`dZq{a8H#EYFjWpMXov^%?M4X9UY0 zXi^yCiwUJpo$xmH3r(8E0ajreN^njn2qcjZCdm6wiCm%~T+nWi+bmsJ5&y`_8dHLJmV+9}P(g6r z=D@@QnhdC6di2amu^_9ejKxPRH>eH-K>K>9*0dRvSE@oGP{;B-;ppo3`|fB-&k_hO z=3hqsebdTJ&{_f1Cs>KFCnX4rr zN(2d(df_(+0jj%ML8#;vAV1K1Rd1I?EpeOc`OgRI^wBO7RAPb@D$|K*un*ILAZ+$e zaQMJh1vp_Gc)!|Sg`vvt>&|Eq=zXGUVDxd;xhGCQv=ijZe3lw_goqo~izN^F2()X* ztc7zuMb!qO9|Ke6&`-*INxn1?f3iv^*0d&%h33Y?3K9`Q?&(1%m4JZ+3c5u`K*JgB zT?*scZVOJYLg~xKECL-S8jdKhe9ZTI`Ilp6-q26B4B925@jL^je2s9m2~7Y1NB47t!@70 zx>sJl^2{65gIrb360a=r8+Eqx0*cHF3QzCIORb9>^FxRT@2-%kI}LSSm=0(;5ILYSX7Yc77$$@s z&7vxx6rdla!l@IEA$qZjk~zwGSKu;hYNpKVQS|`Ugy;Xl^#Sj2><{@FdK{W zADA3ajf}{_yfg1MH{%x@`;@CX!h8PiTt*XALQODY)Tx5GyVSjcw56>n*jC+;mTUuh92A>7GQrm3Ow}y(j%41ol zwz;em4ge&Mnt_*_QD5WTuMfP4eH&z_9Ag9WJxJskpkY6*I~`^_GNK+g36_BF2X;Z3 z6B!dEFG}w!*oHhrmY+Cm&`rM;(` z)SXk}>7t(Sz|F9_x(9i>;dYm48xb~8WMLJ(}oQjfNX!7Ya zsDv9}&3RWQkK>nsO+^jV7->3Xiuts}Gew%m8St2)Z@rZgg~SZb#XzwQV&MTq(I6B+ zEBK?*TF(CX#?dSJWsd;Z%?I?4_Pp2)v2Jf|eH*O;xEGfEI7SP&5d?b!{j#~ocmRwN zRUe!xtwOGO0N;|R>I3=2XJSmhhs(JFl4N5%Y#0TnI2YZO&us_PKLLz4?}QrOjoA9G zjoadUY<**R4#@c=c!COOf1iF?DUU7UdKC-u!*U4I)?UatkXs4H0#K|xEyF27KCPh{ z768aB&Nc%{Mj0!wLYGH&p!`|}=$Wq<6LkdeL%~g-AU^|xy!LY5Re|K>EX;b+nOrR& z#>{M8<=+`E54b)~)b1Z=(ViU6@N+FGcl`=kwopVX{&n!96TMHq>_@rkQ@#l5Mtg}q zoU}Hd7K1=i^&j(Jn7AEl^Du9Q&OXRPZeW$} zpSkpATHv`0Bv8M^!}Hy0!9#>fOx_hB5j@>|1RvT&qi38F0eCM6Q04)XE1*q9lBa>K zy_U_bp3PsCX;d@14=Y;_A9NqTe7=B9nND2V^V0!)pG0dCM%$t=B zBo)$=R=r;09F&EaVePeN@@!~JlDWhjLC}U^#dvGtB8ne6YR59ThfEVePjNWAj%9oD zbH>5GUfv4n9}}cwa!~-P{%?G;y9v=#8`5!(o$UohAy5t~PCpER$oJqaSkqi2k5mjt zUBTsvY#V~3m24{f)g6(YvRf@Qc67j#>^8e}z?q*&jsjSAjj)$oa6D%waUAzC`z>pR z;9d?11q@nQWJawx`Y0X-Fd_EK#-7R;<{}wFFA3H;VO`kfug~Nv+PNa=Ik$~Fe$;t^ zu<}I~(%}}m&;hHR*g-eL>bKhRch>S}#PU~6^4Gj*#E|Y5V*sSTVGYMnnf;sS#yBB8 z4&~X-PSC;*Nq_?BBg!^H1{n<^IbsmGr4Af(2433YFgwLtAw#@73V;Fy!#P=o!7dtP zl_p7(mST>5G>>)0@SYpjy;Y9hQ4gSz{HAb_J0SNNqaVI80%1f~5Zzw{tA~7YL7)lt zG6Ro!)?ik2mxrSNeUc`NVe}ml6@V-n^wMbOiUz6Z1+aXt;4{MT*$q|sPV_B*)*_2j zbyx5*mlT-Cm88K92NFJ65d#{tyrFX8Q^b;;S#f~3(x((sH4*fS#fy!_&yAJB48k^u z#c_zmRiqLm^B18K6x%HbWnY5hTl!2=pk+u6NI-Y>hM0(iOe6Rgh$6y><>ha_GYR_~ z@-7NTVsQ&a%J8N;={ASz!#RaejWM9bn00WEl`~(Kfm*pOSKs!)m~6+l6Ni}H(p99I5Mnv6o2FE3qf=Zdh>}9X|1AStvm`pA537+&}eMZ zXd(t_0!>|b7F-64g^bOtmTA4C2E0ySd=6+8&x(Dol>Mqqcu?uQbhG_g%>q{6`k|Wp zvVJyWrsJzE3^G&>hA0QZ9R>0XhUk`Ph?FovOiFyiOF~D{!AVEHadiHfbm2G%5g|q4 zgJzLU=HL#xuUChW{1IO_>7vd`O!v*5fb`M)3o(l&(Q?Hxwx)58GO<0gkF?jUHUjn3wFs;Ce2c7cMHOBi(Fp%WQO%roVTfMq$!BQX=PcdQex@4$LU2D zU;9fldr`7REi%7tWibzC2w7ww90y@qenDmsgt3fAEz859&m&;a;AJp_(1%J{CVwa^ zoTMleI`Mb3OysxBN2M>awM;WDD>kGp&9W$&RW5TpF3Dn0?qOg^WiYEeVV|)y?JTSC zIjIVtRefftfh(^;Wvs<1uO(ruqbY~fF_+g+P}K7?Hi(rs$T2pmmN%|i7U;gi!Y z@@5~a)0-1of5z6N^42WIwvckMBF6Tn^7e0xbqu&2lZ>5$bfI;0(X8~zb@bV+48?T}|6^{>^gre1Y)b#Hi{!6F{Iy7) z@k+$CUy1lD5wGrsV?3+r$FVxA9i}Nis~hJ$J*%G5o?; z{z}AOiTEoKe|^@|UGkf8s4PxYKa{RfX8YJ>{ff*SUi4nCFY z4L3DXD;7$-huhKG0H^QqoFN(T~tF ze)-xo8|MLp#E%z87E{E#8^()-M%D$yyY|N8OT-uL#ye9aycbH~HcW5`NMOoK$S8?t zL`b+qNG#}0uoX(AH%#Ql|5_1{SV)_=-kaEUkeCNdvJgs|JxZuCOft($BBx8r?M*s5 zN=gJKGYTae872$TC1(dDua+do_a-MDBrgI}H0V+?gi^N6Q(^*A%t{kWOHvfWlB^I? z5hPPndQ%?FQzHXXZRk^-N>WkZq&d;26^o}~S)|4FrfTM;Ed-|lkJB#U(}Q}`xaraf z&C|)k($h=R`-Rd;2h+oM)8XD^_)ughN@RQjXE2p!gcxS1>}EI*W)RS4N=syZw8(5d zPW6O>Tz1f%)IV5j#*3ENVgmMtWa!f{YobqxcfVrlJIgS*$=#sgnhPfAExutoz zfZg2Nk=zns9z-w?!7z`AKF_T*@ApVvVL;y1VIKTRb{1X!jd?zbRDJ_EUk8{^Ka{_R zP;fw3;82?1B~btfD`2!NATBCU+s*e@{QC0SH@%Q2D43NP;Uir3e;ZhASD$zK;^Emf0VV zk{)Vm{_xP)MXYj{s)oU@7QL!ct*wH~s}9+zUJ0)r?x}v+pOFUEO!?O+3D&@nSD+GB z$TQU7(ATzbR3rSX!LusIu&T))sdd1syiTj7SSuvdsvt=ZB}=bc^Qhy^gVapy)Hz$$ z!b8>52-Z6r)Q|Yr%kctaBTBdKyFw8UWi31hu7< zT8$MRiCCW+Sgp{N(lJ!58uiBt)yL{8OY7Lu8`FO_8nibpa5V{7G-*dPrR6sHDm1%# zHoK=cd$c!utu_1nZuTQ=3Ha0!q}3AQ*#b^)30!OB?r8x*HAY!sIG491Xtll+$y3r> z)7o1T30p@Qng<(S7OPvaKD1_dww0u}m9@83q_-4Ezpa)o%Ui3-iNG&fYimhwZ){sJS}Qu{Yo#IE+9PD3bzM>d1!KD|LzST1O&uS0C_ zRSk~o`M)uAsbG9_`}ED#^BY4?_Xoi)eSf1*`9{Bk1#J%9fjwPN+g<#JhJV`G_ztjt z5RzT2b@rKdw?g&k3JOE%3!5hiU&6WBCigsh`oPzk<^>5+MD`*@u@fh5qb^& zb<+)fG+u1{8Qq|cZV~Ge7oslvPi?hnf8DgI3_3)qV$c`)FPzrt8Thj^KCD$2Rbe(}9c0UeA9Rk~{4GFesArO_8wtub4I)B+g(`wZbps7Y<|Lw%D|41LI1utWJxp}`^%SiP8Jqf*>Yz5 zg-$1A{1=_xA?iQUuCep1&GW)GdZE)CBYi{z9K18W6@TfpZ3ofA6Z~&vb90fuy>0Gz z1RPm(jT(r|e+zE!YCHZyCTx$yPHR@mP*cXP@%zElhbJ>*;We9WrbPIz8tSsoyl2X` z`LCW9``>z6aqjDz!MvyFo{wHC*Z@`PnV-nR*gA_JWh{qr0r(&l?Vb_io%tv;Aom=! zGM^h%H-dfc!nxa=u=Qkr`b!4=FP-k@ow?-wUv#>8z(=Q{zG7+|dA48?f%`jxvaHKX zaNG0iw4Qc?&euxttzSei`Z;f(NarYkYa9y?fP=6SphH0XJo5sy6~3}5dH4KVPxmZk zwoaQNEdzl|M&wHrBG6wzvs^~A9ej2~5OEoppKILEZ`e^*BY4-yE!XqMH*)Y+#1+>P zz1KkbfB@dVfcje{+p-N#Z)U)DXC3m7jSZfyT)|CQn-w$azkoW>8a?CP-{3aa^`;5N z)(7y`GtVmWB=PV&oY6}323mA?**CC0+bgm|Xy;YCC_|f>V;<`}nYmkLA9k*Y++h9% zs13HE{I=mIc5;7EaC>hN@vV^PY>un$D5C(HLfMo6@QK^dCet>o{5XiZ=~O=JsB&9U z6Z5o_Tf&vzOQEw2mu!;EIMS$<{lv|8nI5E*B|KIC0P4%{;X3I5O;5k6+Q@#|r_|ko zC}h=}WZ|U7u;KCJ>yT8*`nbzaR)z96``Z4Oo(}fOh+sY-pRBZ%#YmgR!#KzOOQ-dx zV-=5szZ_Gi9qIoEolf_`&fdh%{RR)W4fo=vi%3F@vc}6$vHrU0#?v|EY3z0V8QF>d zbklc?2HQj%IAY!Z-AyZ=-p`y`fKR4z&jdbrFZ`OKOFCn0Ivb9f<-qX(*k62dGTIXt z<(W4m{}-ATE$!mRqRAR|=b!ZOne<}D`WKq!ms`Y+Ho>3x2Tg~Jny3n!g$P5D38#)j z7KfT;a_yms$PmrC0Z6*K$p-YUL zORtNXe;tSsd6RG`nooAk&3`?nea-%D1BG-MjT9^M&H@VEQb2w|NM``rf62w|%ZFc< zt|I6SgKn|KR#4qm1)wjyHdqHfq(_iijp}a(S#JkJthw^7&EI(%k=o3u+N2auf~sxI zb%voGVE9xJ>zQvA<*w1I*?w~9-HMI_m@fEV-1zksfJ`68R3D*8|AGGp+8sYelYlA- zV5Q1eJoXn|`>(Ce+g=j4lMuEuu?sFX2b`(V6O?su_FZ9v)AOR!Pa^w#cJv|$3oH*C zY;g=+lHcVAQmi-GzXh((i8Blz2_IoGjJA>=ad?HFCq@5E8X*N?HM}QDhsB`S#B9}E z7oM?4Tk7fVx;J(mnVXQ|3jG3@Ap`m00gy>x$c*%%1EJygz3zcbr343lSGdRr-gB=Xu?W7mX)#=;G=|F zVQ!aUhe1SmLL&Iv`$%}y-@n7PwDDE4F|sx3lyp2<%xI1=%K#zK%ea6L|F-k+zpCg<6$v3MKTnF zFHsbEQ%xkQg2x4<2VhddsY)oM9|@wP2~+u6{F1l7zx}Z#&!q7O(iigc4?GJ9%4&5= zAnJ$^z3mn~?t3ox{McFkLP^AAJ`IUxe!&}h$L`K5pMaPU0v@7axM&#((ZomHACJAfqVAP)Q zwA8z1W2UiW7S<7I<{_&3@zxG3I{vMY*FY1{~ z9)`=!9Sk41oZ|-&|*wtWm~4Rdwmg{GyXC6GH8^{AbX+V*DQl@G&D~~H2Ks{-Lw&ljr8q(4jEuz7)%L?iUEhdVCcghqRTaN#|ya5{FgTQ ze9i>iNu)jb`{zfapmW(DljRtW?*PkOaqj@DDnmz{jVKUa=N(#9h;(a&0Qh_-nUvp- z@fg++4L@xg+Mf)T?TPHmuR%J`z&r#Y1R@4-UnKuiP14Ur49p!EYISozSn4Ew;OT6v zJKY<=qF-TagZ|9<$N6hErXH;ng|9~ zY>A9YQ6u?uP?TcU?C^fa+oqaeCT9cWhHPNCKM192|r7*hU_>j#EB`O?`%x< zHIP>_={RKSH}aqtD|!x=bRd>7nW&H$c3dj534`+18TxLWf47V&J0W-?0|AgRFrXCx zlSRQuFD6D&0AilqXAXuuG`&-DOc{a!y^rPY^UuHt4LV-is-bN;g&p(+D-&^iy5j1Q zh;l@zT?f59r=`+4rDC#~u|9m4Hp-gI?4L8?*-Gtpom2)TS76)}i1VGUpxLh`6mif4 z`G3Yvc^yHQxUItrJj_gGWAtu;Zp0_s=jXC|r4Qe);EzYR-e?c(m59HgmyZP&r4G|u zP{OAwd4xE>zagiWHYt;P9%qmH(0H6G_gIqQ;ZVreNhl|pERloLNKL>|h8vtVFA3M3 zDr2)FpBpY0!5UejJiuVGn7V++oLJ7_%pld(##5TTG^IRX(N2972iDP zJhEVG(s-J;+XfjfKX9q^yglVBCs@v(O|%G-CD6rar|#}`u8AV78`k!kSsJoN<<*+Avq=#~TB}wZZYb^5nvIZ$77M;kn#3 zR_<4_*buIN046uLP*)|fr?2nbt5%M`JGReF$2~U0Zk-FBajZp}8sb{4T&py8=|Lj; ze&A~1LTu-^SHE_{+1ycoW$hVDulrCG^i78E!sE7G4|2EE^#|7850+OSh`ZbkFJ>Qr ztvz$GxKx0$cx*?0reF9ixi_Zuy*Wy|KC0VtA1RyzSd@47kEwh6r0i*MsD&YRbK?Lz zwL_!{uMvb`X?YOF^ry2T@6wyDmU392V@xowF$M0*u(+6GTw;fDZwFV`#}LPaLS7Sw z(~m>b8z1yM&%Wcbu8iryIi(EnnzAykjF^Zyr7d)rayEZq(H6@M{z0h6wX`ys?&6en z+hNB4>tVueGCJe;wKnL5h<~|t`iF?8KTLa#u*#D1SxBj^&L%UTC5aq>2Yb|%DwdD&JUlPNsL7_Thl1iUmhI4Bf;CsPMzgL8RG$lF7+WxCZ?o(5* zlQ7VY?y+$>==SZUNRBJ*u{mwa84a6d=!3hy4UhIw7oFPaU@Iu6^q%lv$FFck9`0r}t($37p zJy$7BT^pM>e%O(|UEASzYg>BecWn0Dy#4ko+A{6J7v5{zbIh^_ck?o|`rQsjm;2yH zpSh?PB2Gp#QBV{FRVI>H*bsW_>ztO zc&w`V+?m~Z{&4B~jX?Qy*8%Ud<6FJE1HX0e`JO*G-q-73%KPEg+vmD4`|hZ@`EhQ@ zXSrHn^M~2i@6Q*IFttD4S6ci}%Y42M3-Z@DMqi#zL;viqO|3r+Z9#~t1stw@eIcY? ze>kQ(A#Xu_zXjT2U`O-=>2^r|<-MytyPy(4EsWi*T;07AAlh9La7kc#c=sC^!IR(J z;2t121pxbm{5J#c4i>R5Kt%4rYv9CNN2+xPV_p^zY6QJ-Z(Jfld>En1{GN_wKYDir z)gvO5g12wo!6cVG0OVde-gfc~q)#jmzZdWABP1wm5%l7{X%l)`uy`37!ZiF4G~MaA zR(kx8dc-J%KLiOYdkQCWW%?t)kX>QCU~e2E1YGAn(#SrLN-MW<*h>mL^d$w}ExdV* zf)*qs7$lNIDUt{dkaq_o)&xbVN5LleOR&Hoc=bzQ4Wy>`C)B`#Q;1|MP`QA8ip~SI zj05rA05D!q^m4xfa6oN-pekY@t|XYt{bjWSprtLU?cA>;B36DX8ha!(Qj(^{l&PaR zXj~xn6KMc!G1%)qXc#$o3GBCo84CJ6sG2@#&n|vVFr>mb17~ltj|C?ayqG%2)U>NVb~vxsDK3f2Kfz_ zpgP9b7Xq0YrsUo|>gw@`+3he{L_fLkxO}{%j~?LSdxTQ5!t&wpN{N!dnjQcdQavcb z|45n?F{Pyi8`959yTC5fqayR{Ink;ff1pk&AO3dqY%nl}@<&O2pnVbmJvxvs`nqP6 z&?4IZh>S2?c3*39@r-`)jG}IwocK$;h9U81OUgjJJOEvue6Jip0h7uyjz6`K9v{qb zEEV0se&j6IX(_iFH))=c;9r7unjxbwDjV36gWNW8yF*s~vLPXr2moO%smMzkP2DvV z{EDo+*Cqz&zCTSMW1dTZzMmGdB#zoAD3=J}5*QE5LTPVTrzj z$HpnaM<^8>^Dj{dT+XV1O7}-k-(&~Z93#|yNUxJgpEp)KXH>%eQ36v*j#~)kks(%X zn7%NEh%Wz3ySP#CoymN|hqX>N3q8<5DXOFat;|a}7Z1jQM+6`QC=m`!z>9*P_Y|V; zr&JIX#u0Ku@p5lO6yKvLC+#U8JSh*Uza@5zC(%>}w9Gug`29GWggi}NBKuMCfTIJ`QC<*bZ1qzHrX*RmCRuYUT3*k~ z?=vX|Gtn$ieXX5175Qw$4pt;cjpI&DIFkNF}sZ;HD zROkWIbYYb!cS?d=iuy4kL56d;imIJn2zHMP_K1ECN^)`>4O*RxFu6<2@k;~K#mA7+ zEPHQ+3&DBLOqw9FlArY1*OJ+E#6(-#CHJY>j}JwG;1WPeiTlQ!2TGNvNt2fg$Jb}! zsDb5-tL3D&VN2MRn9R~x6Ou%f5$g%{WYLw_fR&u|m1_2t6r1U^VDU_9{wy2C?12?( z*wroq%_BxlR=$-So0S65uKY&+;!LKb&zd_invnsTlqQ-h?W?6WS(TY(WwIj`w;yWu zSGnG5JzlRC@o9x?uhnH%Hw?UQap`L6WT|sm8>m_PnxNHCs0Hd=E7@4f8`W|n(8gz2 z?+R|{hAr#!Ui*e3Js`RsWT0J;x{e*FJ=V59%r`zRt1&sDF~p%cy`Y_ny#ZM$)3$!M zal^AQasLpSevqgi-UEq(LQC1vHg<%C-NtWlSFMpx>$t_srDxoE+WOZ(46;d5#|M!~Hw zpSQBDwr&&KE+X_4%Jr@~^*)Vl$*pZ2{?M!B*y{ehwMnd>4%-7X)qy!*0l@LXE^5Qy zt)U0$_h)WTf9*m1riJXI2?zOv!mNchxQgVX_dv{xD)tFIgbhno6I)dagVO+WaSfN| z6Aq_7UI+t0)=Qe);FQ21tZxT)bEo>p4*2&@8}TlgPXQ(K3bg9qB6&1Lh%El(C%P&% z1~?G0t6_efp>u*^``WJj^X}BZE|cy$4ZkFtTq_HzG6!UZx#|}zagFuffX5!Am~nczac`ONJ@206 z;F?TGvowy8Y!bb^7`t2+mtvB*auTCT)^|a;ec8{(N_Ph8w)@F(Ca%i+Q*9(l%^7L2S&C!S6ZevHl}8S=@x@c=1s;{MF-r!O~~gD zy!sAwkPitVre1`HYP@DBrw7;X4sA$UUEsQ0eVUy~L_Kh{zd&3+dPa$O`^b6Oe)Pc+ z@hdX+Z88aPJsi#(ESu*>#;J)*Pe5Je0XP3=+EU* z;llTrChZuxw%91G1kPjH19M$v3m4ntL2r{Joc5F?!3-Sb^u=$v5P0_N7KC!z0eOhh0+c|l=8H`|r3wvyxLOq=KXZ!Qo|Z4avsu9){PIIV6t?QBiY-w<8Q zM_f#&+O4VDQB_^!v|Y5?+A)q^;1!)gn$Dj?bbtblf9`l;+z4TZ)S#N}?r035EH!1H{|m&sPTk>LudE zDu#d&k+?N+vqMeb5x%$rS@Fi(P&|sRpCkgd>V?ifaMfn}G3a!H>=XXV=1N&Ys9OqHZ@cjLzWGfuH<_Qu5bET24Q04W$Jf zy&`X@qnsp*?d7tEq(gPjac<>)2`FEftNv0}`CBT#T^e)#oP7Ja`8J^ZHXHjEgVyD7 z(?$Q!&F5dY`tX@jA6=hG?ubHNw7YKEbX|3}Zj6`Kv=2X84l!BlU0S%ggfzL*Mc-K+ z-l_PyTA;bny}z?fK2ltAZBcRy_jDtXb902i-?`)NIxRIz+PTFUyLr-@d36ygbBS!T zlLh7kg|@){F8DvtcoEk9C7nBf>)v0&JvZ~0hQOV7v9|Bl=Gy?+AOSEb-n}{)N0o@6 z2Rs(HbRRGO5FvjRWtNqaF+x)^5^XP4k|0&qAeDm*%%zgb7m)Î-XBhmc678l!1 zxy7O_-~f|f;^RKO!NE0>!5_h-+i40dP^jp^Z2EpJFn(oS9)ZJ;bt@iGc6a+<#sEjE zK{)^yzUbM6F>4?o#m*y@6d}=!vjjd9*18-1W)Ywdg6BnO$BIOdc*JONFLHZihIXHR zfRcB|A>axKr6Yh;4Y?a1hbw}>V^dEPq~J+6PuV4h!ErpfxV$OkiFyg7pziV58JWs$ z#6XZ|#gfP9`(Ha@zftFBL(zQ((IT_$in07l=2>S2wz$f)h>l3^;Shm{IY>5Od*pBv}j|pOvoG0my)N^IZ4=)_22TkfIzoc_miZ((Pl?R&P=N%!+C%*6jNO5fc|EuH!Q^F$e*^KGz;b~r&c*9 zpgoRzFw^>h^ToT`!$VO!X}vN+zc;CTfbYgBnLq9O(Wek)+M8@#j-Y1i z?JgjE>$jJg0q6|j&cDD|IS7eiu-?MABhFi18KP?XURUHPvo3J8p^UPRWo({9l$50#`<_2oCak3d z7tnUa5L3;5$32q<)xgat*2wyssUe;_f)0muq9+^_1MWsoemmo517KiRsRS*Vw%ar` z$ekWkf*t8Y8@phK%m9N>ei@)q#eNGw3?h|98+xU*38ek}?vSb(9_hBA7U~`!qXIZW zP$L4Z?Db)gT7#$_^ZXw`K4mx@)Kl%r{U3lFU<}vz?7Hq${NrX$Kup#w&}EnkPMAWaI|U8-A3&b- zFF-yh!VC|nAC{%9`o0^fe6o6i>B3hhEWtRzzFJJ`^J%c@4_AbY8_NqI&-y4-*UP#P zY$0rvB)<0ZoAc-jA-p$7--IwF`GwK2?>;4Zzu7dh9 z02V1sM~9BIcwCKCHYONJR+zR8U znIy63bA;i{x_XbRgHbvta8Q7KOpb~XS{c!pp;W?TXM%9D+rokr6ajDP{9#e_{V|ie zgTNx>2twV0u)F#p{PzZ0wEfD6jKcy{;U^IYhK3tVz=06kdd|F2)?OdNE8TnNJw3p#m4d`k2?OeN3heei{@e6m#JtyryiauoLD=Y!ZzXMKq}oy;g>EadVMhIolEkP_m7EG^@i>TTn1O$-HrNZSvijXD!fH>WLa4g+WXb238#zKBT zylsGmN`@p#+UK}{>%7OkGGHg-Vl4%82wS0niXDSW9?nA1v%iIK9m{;+vwamF`%8x0 zuMhH)A-DJu4MPK2#mVG+k;87xpbiEbHgXn)0=7B`lb8_|Ct)kL>}Xck2IQWS)N+5mqPt-*9~Rod_M- z+keAxnWwbj7dUSJ0>>>hA}IP8sOz2u%gq-omv#kl0_{z}+7W6?L#!gzh^LH3CYb6K zJ}T{Tf~8XF-Ls+YZZwdng$gag)0m9&hGGGf6L;*Ul}YBtQh65(K#}G``Q1@tWoKb9 z_iPReuUvy`#4rUP6UOA5Amkij6Ch=19|iynLpe;OQe98851| zRVV-Wnat0V&A^_I9e&u>N$;7=3YM3cxvel&tv|)0pFWTqVMu5oq)1iT4={@4vkFU* zy?v|SIQfR7{4G?sfj_8fij0Ikk5XtCkfJ_K&k5dx=`{>#!5j3*a>yV~F+gz>Z(3Wc z1>1QZ%OkZmqe18$0a3i`yCk^7BRaND*@QY6S{h{PRW*iW-^qR zdQj82;hhKQ+Xz8}$j51&Rq;T7aQO`4#??t#FPpT}*HtLv;cRI1BWw5vGbjWC;cpZ% zH4<7gKm+!=(};5kc^*JwQq$==@iCoi)EsRVXQeQ)pCVzwJX8rNl0NvvkFotbnn6>j z=C2pjO4rTm&?kIv?dYGA@fqqUhT;QXE!j)Q39!k}^XrE9+@{OP3-{G453fZ6^;$6l!w6Tuo8{PXfCA3Kek$IY(U5S8tvM= z$Aj@oOZXGhjkZZ{iU@+vdLKWKuDb1F2i~Lq^L&o0dy#giaA=ankX|iySa|s5;vuUJ zYAdM$wIdUW`NbP9kaNSH1gGy^9^NhzpB$+jPni?@+8`y^+Q zLCf6w!Wo&u$P?dI7E!j*QI}U;pK~}gwv;=hJJ3myua?@0LubEeK5vk8O5~_0UZ0~>B>g5nYU?3Nc(LcH+P0r0BxXZEBFc4vv3+*AFA2FDI*(>AK?iD3M zy#>92>fSd-ZPOk?9qvb4P=_N?La!pkWzeq>6u}HP=)_K&CQ7pv$&FRa{i9FrS!1AR zP7ZX(K1HT*jTGAS#QFZJdJq?w@+1 z%NO*E27%FD>e(QctcGX5E@QxG&f-+1egQXX;f&$ZfIh43>fw5xutWx>ChCFqI+cJ-Ko)aP8P4 zQ?!oxwcg)ZU)tr|d%|$U+yv`VuDO7LtZnvn9zo!Ppj*0t*s3 z(Sfru){CM>D^1pNHAeN$5d;^2VyO5}3Kc@AYp^J7hzs>;C;=T*zgwbZ#Egg*^<+b) z?)Qv2&y7Dm?lG9|2a6V2y7uet4qDaq<0a1EE2@ja6|tip_^n`&9Al8?j+wz}>~-%G z4$KhI(+sau4+$QqI#P>x;Ol4Y3xu0!n;83Q7h=q=vY#g^cu_gBngY0JRGVltYH7Z3 zMtms}vCcYFE-03)pp_awP+K*1)}?Xb6w$n+(E`$HARcNpDLPD2JFXUjw)c(d%p_WA z15_gezL^Cw9}RKPTJzHdjfMrOn&T+ag-}ce%bADT9yvq2O3b=x!DYoSMEoX$E}S(u z1XC(P^(Z1uB9i$ivWhNXp3XDw$n>b>YZOdWUUB$cNi(b;d-#jDETE1PJm;EamT%c>E}nVv1bn3h#$SwgCH$!iHD>P_eB;wy?OK!c||QzW<3+{gdSV6;1UO^ZRSg>TCY@H)7Q{ za_?_dt8aDR-T_Rf<7-=H0nsDV^IP8!6ALS2 zbIaQMM^7()CKXmTbq{<$JTdnDdUgBDD>lO-Fvc!4J}@aKtGs?-e75xe1||QaM&TQu zRZ`!+vAbVb+v=Z?6OmE4v9rIke;k;cySBYIJT!Vo815 z>G{vf=B~ksx$~dbyNAb3T>~+>WfSwux4#}QuWmQLANa&&S_Z|2rx)edG&gn)9G;$6 zG=FRB8`=7PaC~+VUr^rgt$%iTJ*lWFEUh3UB`>+CD)N<*GrUsrU$2z>m6E^K#$RjW zueI^l+W2d2{IxdzS{whrSQ~$(fd!O37a-`70%VrR1-a{FRcwQu0?y z{z}PTDfufUf2HKFl>C*F|Ia8nJO$uyZM-_v`|PDQzPhyeQXBU^cjjmSlqbx1i3sE;ne<0AV+bbr;aN z8T#fEY*06pakr~eH$p=<5={9L8)yj$^imtIN(Z@?|E-N9AqzSZ_F$^?!0`4sNcUg| z^}uTLEvi*| zTK3ZJ^$th$;`RPj>XiRmsiWt=JL~1t?s#ua{+~*nV-E!5+{cggiHkiKB_$wKKX|fM zi06ZU=n)iOgCPG+pZGiv$e834%Rf$?Liiu24kKpVNf^|xK=e^kJL}(6y|vGOxR1q9 zSTRVng;I2f`@g6p+sS-R+SsXw3lOPU;3doOcyT1cO0&^%!P-@20_ z{J*q1VJYN&xxtiATHR=0i8>Q^FAfC0yZA+=B9%{~8s^`k)r%po!4!7mV) z;rQ~Qg3^DZb#H5NA1^Uq)@WhSXo*ODzBYGh!)Q5EOc7R3asO!5jTCvl6n4Z=UB1|2d5^qvza-&U zjdpE=GfR3TM@E5ov$3>DzVt(Yw0gX>n$}nwa&^0Pbw?1ghlL+7g@o2Uz%l@Vjs*c> zIvT-za9|JN@&Q1f0%RxwGPVTV*vpLgjR#5qVAcO0_U!CAPwySqz}l}+C7m+#*-2Xip9Yif!Uz4b=LW!917Mwj zaME#LAO#ST4G7fd5c`Vn_O5Z8Z+T|O~I07#gJrZUt4>%a<2FkA@1K0U8HbC$W zB4b?-BauL&S7h9v9N!raWamm+kZ)Kl7?qqFEA3Y3r$fnFC;%K3(0zzB@y-wX6d4zf zsQNRqVj(j4Bm4(sKrI_mJs$kwO)fAZN}@|q{dnw@DId^VU5gFi(#`zGvM1e84gT+z zU3&B%%bvsjdt8lD8KSc0OGVweeKhwV2Ja!c*A1DnkMe(Tc2(-2f9LE0qb~Z57}P3^ z6jOPkDt+O}GWg-L->K(XCTR=7;YdR{um+^4wP|YK3)K+-;w_5g8jY09s`!}GS+Y~T z+Nqw0qX83XxG}0*Gyl`GBaHv`?7vmR3K}_xr&%~v-t(#ThGYLF?K;x{YqkF(?Fiie zBJG5$@`Qh&r_HfuM7VR6GfTx3qNPiFXIxaIJtk&z;a^cZU4z;yYA^MMU%ylrCRSa> zo`qyqXW^Xf_!nx|)c}Og;K2YG3e{per_`rZ|ApGgW@p)UXAQX-R8vZgZ;{@u=JF;? zA^50;LId$DRTyKYh*16~YTrsk=jL{totpqp&X;p4L&u0#`{!6&SR{j<4b`1-* z$67I!>6!27<93m@kb%}|iUG3JNzBo9vP50*RGJ2)seWT&7c{Uiz`xENa#BfxCwq6X zU~?%Ja;fdrxtEgk2EQ`*In94#?ujqqci!3m&fF{7G?jN3s$wcSduzX-40WvPcE4N6 z)>zp=)RXU-SAAOQRrofT!rkK`3liWNE?jZlT=DW*k&9YUep&&KwWUl66i+nNPr`7| za2sg3tp4s^shrU_idvoLPFi*t2299e&n%5P=&vZOZlJKtR&vd~aIL;GWKmf&;4qXG zGgPu$+igfZy#2X&ySjABeOzcbMzNN*Z9u@kl7TXFe!AAts$FnmfctE)%)NeHIeJq$ zbn(*h*s%V@EOZ95d>>+TwzEDvCG`Am1A@kQV|v}_X&p>F0nJhgVA+5R-GGl>Q{*#- z0mmVd&_ktcpzIk#^chcB7$cqKq3uzloNZu9nmkf&Zl)MvtgYj;v%x8D;uo1*>1|s4 zG{Gfd#w)6+zS$&Y;mkxaA*Puo@8cws+@kWVH`q0yumqbds&CPK-6F%Iy>LoL?hcP4L+TyUx;)Gq{;%Vo$+}=wtbE`0Gcia9DTF)o= zi=T#9XwK|t%d8g4+=X#RxIIsVIyu2s z1r{Tvy&VQf3pyMNx{)1~u}1Z?pQ@5(8f%)Gup&BHeQKc=qSPW<{@Z%63gU6N{s8(`> zR%)Sps-t_QjQc0@`)-z%PT*f2uoIr1`%sbQK42Pi->UttAS?d4eWB-lKbj){H9l{! zMIerK0sDcNp7kKgK`?B5C<|AFTpcTu; ziRI8+*2b9nu*}YeIM$}XzUMoRNjlDODve~Oq0QOP{Ul5N3{B(QGm|XCk9na+1y!tt zINbSXhi9%wab`z+=|{VjN0&cs#bS<%&k`%onkzhQa`uiUu8&fg?6RTkrWNdn`Hr*n z?1ud8_9Bn*UQPL$*^i=MEiAUJuUe(jE`0j9>G`<5k)ge6H;u%;ThY7+bq}Q3(mAI+ zz{A?F_+fBPb2yfHq|bIp^F)5wVhl$bJaKkX^l0CQ!#_%*KI3RSdG~&nMRgv`w7{Z2 zP2w<~`-=2WtH(~4NLrQ~&DQU%HufC4FwcBh9Fx~hH+d?zVXgP7_!id`53-mJX;_Y` zI;HxacRZejM>!=|IMwo> z_ne)VP892IpYBfD>aJ0KBeUinH+HjHcq!qPtAtyn zSZ%68>Y=tTr(tEP-oKlT>Y?RCFDm4&iEFLuWvD0QrlYkdIWJ-Qn;wgeDl$7BVb&hM-#-=#MOVZ<9wI$qvOG1QQP$i)p2U8( zbNfsvb@!9hq_F>qgY>f>qd{HVySD77&ZVbV;^&-WpFFFFo~Ge;+N(w@-(P{Bds*AN zt8+V=o+%`s%DjBRzCF(aR!&{TzFYbBYQmC8-2W2vA%Oz_F6cwXxn3@${Q%l80oE_W zO3$T6&yz|5W1%o}uYCUf%PXJvdgb$MW83#HJ4WDDC657K@@}pX8sU*R_|ZwG(P{b7 zLFB-p){&7FdBA|*j8ym<8gRY1cy#}9tb@=Q0f2BotFIjna)0@2=K5o8?(~6P6n?$sxT=bKK{_t(KKf0k84OK2yJuRtan5)1u8R7y%(#7XQ>YMq%q+ifZ ze8Z5ZMqvxI5tWr_n5s-yE?aH&xxYF+zIRe<1;TkfZ$_A)5lD$MNWY&Gm282~*S=vZ z%QFE*;$xlZUzP1ojPasn<6Mz`NZH*_8%XOx5t5|D=+Lm^&l^^J|0p;D+x+Kv2utcglSX!_L_`@@Kr`cAyBcQ{;Imio&TLC_j{2HCWUwqKC%Kk ztSD`GaG(TT_zghRDm++H3I^8M81VSxgGO?ge|=FNSxZZ}wBALDg=jnnm5l@mbOc5u zgX$#3ii^c86(rg{n0%a9vI2o$$$HeV1zqO|J_F|A4cLmUs7 zrMtTMSliA9^;kv8Kva?CAX9M&Y+;j2M{xVo*5|Uu8_%fIazG8aDk1!jPGuy#mQHji z__i)(2vU@IJHRiJjLEhRmXVr{nD8C=76|)N4lyRHpY)Qmk?yAhL@61Z;{wwS*R5^? zGg2M9w(3v}E<-b>qN4rc_2Yz@8Amg%JQbnRHe@pZF?M6BAaOk}l*D$5OG54%N-c+m zj<2x5!~BFIMsrEhx=0>L;q5lw^-CIlS9l+`0z$Fx<~CeXfAPI^xjOd41_k~aZ_SsU zUyY?GJrF-Y*m}`F`jC4s6Q(IdVw%ji9gMr;JW4CKoGy zxafkq_*J7F&IQMaEJ6YKg(XNFEOrG^qMUGvOkT}@-C2!#beGS=)PFh1l73bP5FehX zClVn6Y(mJ#@?5U;kNbGaYo%gMBiKa#k}TwO_gUYgZH0K02NqrhO4C39sL)xwP~_kV z>ClTJvHRa4h>(e44+w*8#(|MXBqfFtP#*^(6ah6@Vi)Qd#3!XnUyh`2A)VU*OlTfo zdvM^zzF|=gkYR?tC(`kG=!rT}GQiU@dRpt}MZ>I#xHUD+??Z zAOlnbdjYQKf$z|P669&7fU@v-Mh>c|_8`+V*OC&g*<4ZFA!W3Q?I4l^s?QXN@ey2s zT>$Hv03LNhBD7m!GDolqrNl_4gz5Vp0@#aC#a60kCWLC8@EufyK@nKUneasmI5`9P zC@5P;T7*gz4-zi)0wSR^hr)}D$f++rh}69c z<}+6GMhv=aF(%j?1+FltB6i;fCfjsP5g4lk zYD=4-p(sPZ2Lf>24TmU>&87Jm=@rYqPs`sYAt6X?oN*%sbdIcGw+bR^2OD>^pCEm}Hd`6P3< zda>l$y2j1w?WL!GQgOa^ww!##l>^}MfJ_8_OA2!C=K~`{jEgvVCgk}GBdXJCLHD5L+mMll#I6CraseSwKLNsT2mz4TodCFj!`x;hQjDG^k*jy35pwnhcV*vN z=q+V{R(V5TPjSgn6p?^+J?p^_RLr6+?8+p_z;u8GEkSGqG|dDZ=JwZK|J-W7bl`dv z=sn;W##PZZ<0~<3a3`!}O(6cs`nft)H&)d}2NsnCX~GC^4f+?xes7&Jm__X zoK&v53!riz)vUez)_{!70+rK`aa#Q)M1Cg&Z*fK%tmztlh+L?Y4?T20T3rc)Y!-TJS1hc3nggrxp$LpadtBSKRdM*N803{k^pxvM+>HAOYcZE)WO3NW!O-^7Phi6IUL6#UT^I=EX~e&W z;Tnxs-2XVHK;Tho<7;cVy^z_r$Nm-SVq2Zoe2$~Eq0i}b&Au)}?`|v#K82_FQy6x} zb6W-I~gi^Sb2^?~8a~E!=vy@ov4s!8L&oRNJf?9?`tK)|c zf54bUP@USyBAPRH;DdCd9bX7((z(y501NiuwLnkJR<+LfL*h&;*=*SnIqBO5sEn!) zXq{t}9iOs`(GQR})n+2b(DR>&4~ySDZwMT@mrUPYl`HwqN|~Pt%L*Lh+w#r}?0D2X z$(=O7@o%`C({&3)lVe;r%dZH7rmUo%a*>4lPY^F6U~)`xTeJZjp@(gp<}g`}FP4Qu ze(?l?fbeqx(FH}VezEq4#A087wjsDua?fFHC?)CH8+p1b;sAp5P$uiJ4SoED1Q7;^ zNFAKjYS=nx2$&$r5Fs6=HkQ&?m;)DNNPi+-RnfVphMtE8&WC63G;AR0LNCyTArz^w zw`K1~Y{09M?i(A)=j5Ev5~F7si`pYU_(3lxWdGKIek?W0lF03Jx@yX%&fm) ztU-a-z%oe4U=jc#830@5cXPy^%s51#apvWQr1coumJz-ysU~sm0o~?<_t@_MMGV<- zr$Pa-)i zfFhED)hCw{5{N9hb>2Wp9jZWTy45ghO30C4!c2w$(>e0N_#>tX^brw{p*V~onP^Qs zEaEDPIXr6fs`n|G;2x#)ZXU9P8KPpoyOIDc%|}$%z)@wsMtpYjnGK-K$1LSqb@KM(H=UGJ=K%OT08ymk*2C=OP%7Sb|6% zx`-=nuOX1vkku#1&QE9Y-cv+A9Kk;RIq%Ns%v<-{*$1i=}}F3T-+b-~%T}n8-3ZRr+^o7HFPF>d|0zWt3T2 z8feUw5+=#RMuq+8*~6$uYYFqN_&)K3+RRTJ*g8x$TiiAP{zFfR{WMFQlF+iC9GmKI z45fRcC4mHK{?-bkhv8d?`94xv1hZLW3hqaP+rYelqwZ#o2bc+_{^{(Yn3gu0fNX@8y>7mE6T*obWcC}^Y zEgT5Hifmi*7MdH&rCJ%gCm3TE7~9hpTF=UzZ_AB9CWTaHv^VE z%c?y`mVM8veSemN(5i!2$30Q1!z`AgqN<}RmgB~%?LsqM6e( zmh-!+bFicCH$nC#3i9sFJZ(b zX;m-j#3kibFZG2>I;>tgj!P!BUM8DMwzyulnoF*!Uao^nzQ106oJ(Q8USXX}alc;i zoJ;AxUg-~)GF*c)8n+5=g9<6PDs6)*E4LbNgPIVxx>SR@61Rp{gN6~erd5Nc6StOE zgVq;r?XU*zIBuQP2Aynf-Qot_YHq!z2E7gkZvFlS{c&!C`38e^Zo~Zs!*gz<`v#*w z+{SQ?#%MeyuS-`+c}!^=O<8%&cpJ@xc+905&6Rj8v>Gjpcr2|NEuDC*yc(^(@K}d6 zTF3F&q&C`Q^Vk+Q+E(+}H8t9G@Ywe^+K=-%%s0xyK?BHtLjy=&Hv*FXL6UJWv9eGw zv9d9IW8vcF;^qc0y`BItg82XycK7gT>=zaFR%?GF_HV@gjo3fE5&Ppe zV*f_$--!Jiv411>Z^ZtM*uN3`H)8)*Yk#Y?zt!5`YVB{e_P1I)$%d>t8^GzU*8Wy& z|HLQ)^;T>D|7)$CG@GxQ^#3x|UZ{@_Ag2@t!U6!uc;DDIk?>%NRe^bIYj-l$XlzW|g-#Q(uwZOontE>tsDJ=`^LCBjQ`FMU9;a)) z|J2&45AR@z{?^(<&Sk})@AFK1=)S;uz|)!#2E_^3qIAyYS;RQO_JJ`Xbn3)#p!Ce$ z+2ciaK@jRAov)F0d=Mf*vAM6_z2h2*-q7hOUS%&ELT^T;_iyW|O@e<#+OI0{{zlpZ z>HZaI@BG*zf{q{t9mmMa>vMOy+VSNV3E21X_SDWk2JcVj(?~yGGG*=u5LD#Pk!MEb zd>Tw$N~%dV*Ur`oPl^dh0^4wBGD0p6@^>1Tx`jevJ6J!&v80HktArHASww=YbC`kj zeI*l}leRMl(ZLhW&Mi@j((oZs%F+iAL=bf3UMZh<`ffkoYqqo)57Yq=;YT&6RyF-JpI;;HXG@@L%-1rzp5AcKHq`hCE3lb(NHlIPO@QDi zDzI6Nf-?3~x+VoC10?XPo?GW>`Z&wev4hqPz7~LrFub;a*=xZmoLCjNoSOFqjEDI+mQpZV z2ud(*-I3`#6bkkd^%GP4qUE6445^kMue2!B|P+}BI zf*)i7?up5vlleg3>etH}wOOjY$D`J6%9@0yAml!;T$4P2q(rY! zK)#(BQ5=~c#$SRHv+kpnI8Gy!(0P)wJ!E!;SeqpSaO#t}VTG zY0T2pKAt5P-(8j}&^}JvZzh*GBOj@JKU6I&Vkl)LwpCNGP%mX^$klk+SNkzUSeeIF zrZ^tW*4oBJgkUAGZ*moz6D zM=RIubB7D}m)SI-`El--xuE*L*V<_=+?VByV0jn1&_bQ9Zl6?c6c_yA`nv}aD{LL<}9x(mImMU0XES!-w3U=Md&GR3=J=r{i5@=vYZ>3u)3rAx?{R&yHO z#lZ{uBLAGS9a^o$A+5eElM;P4l68+^oquZWdx17O0j&bC7ykl2$OWrJAQ9n7cw&u8R}j@?I$9sS1|s`_ojfm z%|@}Oe*C%3x`%O=(p*!YM}^Mnyg^jsTnnsc zO^8ETPNc3zAIWR2z0Kb6k55Ef5mWtl0f$#&KN2j$^P|wg!O?4ZnVkNvG3wi?Q|j_c zIBHW}jLexExM_LSL6Ns|UBJm_{@3CH4ll-{gOmR~Vc%uZLHmn3xBIPQ)^!ZDfRoz zDb2d=(TD?#;6A_B+C6JiSO2NC&$fFu{;jo#eO}oWyl;duIQBaCnqlAa_<6tjPputB z=u`L8>e(l$=hj=n>2BV&%ecR__VxQ7+O?~_uU8@nZTBF1Lkfz`r=7pG_EhlNjZ^jW zuEzN3NRLi-HZJwjH-g9Me~7)nrdo&38t1QDAODx{W?z)mCk5~O{}OxFyVd)(-`(Js zJu6)$7B4?CQ(o?CKd|pvIsao%cKb{@+T(GUz>~@AQ=C0NI>*X>+)8b`g#x~)+GQUe z_y3vx)BTOIdu>XOq5TT#*EQ6yo8b z;J97qQe-DYMki!NClZxN@38R3a_8o?5L$tdYF!6run5Sm1F$0uZ{MZzxeISbq$0g* zEJ_GQylWAwvzoHAnzNHwT$JOuYu&8-5~_(D8;Fz$6KV=Yv za1Fkbey?+|6f{x)V?>~m^xt}X^hPuz7bJc-v>5oH+bOy~K)u5oM69O_-#yvCho18u zTRJd!V2x9HsS6N-7aX(D|13jc6+I9O`V|qKp&K3)Oa_hCDIGd90Q8lLGnc^+7DXJA z2o+6@-XTgkka%k5>3Q)uK?!!$)KWg1MnhS=1 zo>Vu?)Hl`-x9tr7NgSr(>#lQ^#q}K!LmKH2XD}LJEDPo;udnM7mp4-D?gDjnBXbQz z%TssDtD4HQs)WPR0XANf^36rT|0LzXv5~-?gz)K`qW^Bn!^h2-m(05VkEZ;Ebs>Q4 zAB`h2MC%g4nx=P2P=}*Dk&X}+}9vyOdtrEe%r%C1W*tc9^^(jM~bFJmNg^l z9Yt2dNBy8f63$C)Y);%OsC#Z5&rTX^SyH+ePTKmGC%qHyAS)9zL2(FA1%Uqwm_Q9X zh&?A8W2KJ^P|l(2QvP&2fs)CQ!Bvgsmy#WT!7h>;>RV`Lo=c3MdF%p@pGO`B?hT* zT@k$oR-F*AHYW7VUkMSMlmgt8Kq1-cR1dF7ykLXQXZGQ zK(AWd&*`kkDX?&I4t{tp#7qFXdJx;>oOW7~H-RV&pfoovswOQEPopwdO|DH|epKC? zkW)|sO*~g}lzmF1je-&-Q^P?0lMJyp{_K3IMu~jA!l(x8_2lK&?1pgi3jz>~ps9vJ z#-*Vq5rWQ3tp45)8BP`+{^!)kTTbg3O@nmJpdPs=VJrf+Ty}ajNDB>0hg@8+=`$?GELVMx7oa>#*aaL5JuiRdPD%j&-t-IEv{J#mOye%2NgCBcry_k z3zM(19-8hw8liqINigNMrznDtb+c{3P;8Swvup zjFw)dQi_Dmov3bwsm_`X^~tm1uf@gt6Pnh^bdWTqBQvd}?s)J7H6{$u5D{q9t>V#E z7owo6^jYh`c4_q>a~&aTw?NlEZAmmmH_Dh~KY-*gH|u9Z_{n0{+3&22Md~2yV!)^3 zT5erFgQfa5+WMHrFh5xcpuVZCet&PtutQm6WnHk}`_W$gF8$@bEq(CEYyB`3gZVQ3 z^2qrDuH}B{)tTLv$->Ghhq~$2*@cu<72Q>rXy06p^Z`HZE8c- z!qtUZ1D+lO_T$w(;^ZTgyaR)}Lln-FhBY-e?HvdC-Py_gmo-r{!`#PJnQcS1>$U5) zmK%w>TaVRV1Fhd7Mx!7j{-EyN>-9e{#)F@YGMCn$V-&A7n75HOU@SLavwlH%8bTRX zKuWGlxNji!Z6K5I!5eZRelHK;52#-1g+$R?yq#+$-Y}Y~sn{`rx^}oU?s(I>1+D z*1%v|Ilawrwk^=OBD^Q^o~2m`$NY-I{DspzP;5tBvsx0|DAhhA5xNtTXzrB1qt~z_ z7i+ArvXg&muB5ohK4y+gWTA>`s;0O*jAWq^8l^SHp(D7g7P^aEYhjmfvEZ<)*T|qb zwyl3>aRFmtQq*KXvX>-m8O3Rdb+T*TH*R?+VB^_j5o*boXK7Kl$27WUmqltEJK%6< zi3V*Ij=k^F-el@;nW}H)-nZ#WGvMZFHD+h^J!yXhT)FREl==CN-T!ROac;kIc)y6~ zK$PVG=&ALIMEc8|Rp{A!APaApr&UBFTVx|g)SYE?J8MjqT)3n)@0GRjwsj}+VVvYE zW@|~X*)$e8ng&@}Jh|=W`83Q0 zS!{(k=0!ZFd0BgDb2dO1+u^b!(vYK4lIZeKrYfHIl`M4Cl1x8nRx4obI?3$1WbF>P zkL%_bLt^_I3{6@LM;b|ZettD>y;J@bD%kF6ryOYaY3BHu_(b5=EfoT3?l97Jnm=^f=6^b?*}S$kxWv-1s;Ij~(_#$kxZa4ly~e&t!@cLIb&$2b z(`dD?>FBCywbOp)QRmoKc=j#nOdrJw{Nfn6b|!*);!NbkZ*Yz{cXquua@M|nRVDU2 z)Co@B$=TkCWYr0y$mzW9{0UY_?8K>%!TEsSnGSrOjOq-bbP=xSobGt>*c~n&gII`Mc(n!jKxJb)&(-l#mfJj zkahQj=8|aNq zW$a4h&c*HQYPj)gq}Mf+(JfQ{+CtY2>CY99t=pO4wHS$8Z>-x5_>wnuge`9W{a4&#+8r6;3{j~bHCt5}v2F0{S^G=3;*p0nt zOr<K$~ojfDbJaNlCKa6{#_uW|>d-DJBlwH1y z6ugg8ypJ}#k8!+@MZI_J-}?ksYIH$!_uilK>bLb-7x(YKZ@juUuDgFg{iJce6(sfW z4!Snj>LK_`WoXzZmd4KT;!pH~)sg+5+I=6Q_dos2c!-7bZfbpqr~O^C@{lOyUHNSLai& z#8K__xw%9AYsbSkCF_h-sh?Wwnfp(_Q$CM@Kle3!W}kbi?tg;P{|w@NE*<~eul3v& zcG)-o*ok}Ei0j*-^c*Vi41Nx>QDc+BO(A`4(+4+)L^k}ptcO{JemTMO1JJz$y!UgP ze;!M%>y2X?fg{vr^9y?jn23WhWmip;iN3)0U!nEiu71f{e;LproWNF?nt@-tQP{v% z+ycSx1t=^QC@ez*7jgZfnqOXteR0#X*0tYgU#86~uCI~M#|ww;1cyFDlp=%>ZU9sO z;he}h06O>_4Ils$9UGKV(}flEuUb1r-(O8^H-A6*($0c^>k` z6-=~9Fd{yrGakV7U`J7e;T-Ab2jd!nVaKaIVf=eI@jhzphR3_2+3ph@0+9f zI;FUFzcqbQk9X3|QR273F^q|_2YIa$SJdL!eh*zui*9hbDLH|fF_y}Bq!A|Z@Z6Oa zWB{sYXEjKe7!gTP^W=a83kbYWZP7^X@cGY-JiR$lDlw8h99%$r^$-xY1^@>P6ov z1+>voEUCD9@nAA9Fc7hFFD9X2GA}U*2oUf90T3&xH0p|&Ll|jcp7nbaqz(z&DX`pW z6Zx3l8)g#JS>L|rg-|Tgm*hqcEf(jOeF%}0ldsyaG?S(K(iw(qTpK}Drx*ve7D-_t8S(EFH@w>G#cL-sDelQ9S4&k zNBj-nTZG8XM&jQ~EUlMS_f@Sh0UL>Q<*<4fFv>T0f^&L@BWb7MBQ5a_~U?s$cY>mXtRitzG6VFuw+_8(XOI6ax$j>S$CC$GRBVk`oR44e%#A{2H_sePsNDEbzp%8kN6OhqNDm|p` z{gbPw+X9(xXPy)ZgbSlT+MdPXxMbKazPr`uUGx5B$2LHIkTBtZU}3sDf&V=|l7Y06 zB4Hi)g{yh3?P`@}DW3sZss~Mq-=!Cq78_1V?#qn(s#lb5%WlF{d{_*^=0N39#WlQ} zsEZzzr>MDN`kG6K0_FFIj4^9c|D2k>6(vO4!anxkgURFENbw>ia)$U;B#>G{J4@VXOH@!q6N z0st@}t@uLlgHfIT!BxDSVm8%k6?qWEYuL1a5qffu#BkJ$0$M>E zaUX~rLqNRN&q0myAd>nB4D;8|1n4YGA9u(lF1)HDbCmo}hL>TXO2oaXRaDHvMMMqR zMA?0zp%{9m#5K`@TAikV5Aa=x@bMIABJ2QFCir()roF4&lkzEG3=zS(P!trp9PLK4FkAfgLGWf^(5yq$FoPi-ZM24f}B0Ms&`~PJS8Kfw1_2o#B>GK`(q1fPLE9oOnQk8 z9}L+#bsLl#IuWLVnlRWB0JMm;+y{DY40jsw%*1EQnZ6G+k8M;m*a(3k^{&vF&y}=7 zB84;`4rK;_sz3lr3X_%2>+Ih>fjwyeD>FjU+J`fPrZ-(!Np>(=FrpC30|EVxEQsbJ z;Qc#{E`;RHK-d~#1UchCi9B>@@{JrYqzjuE>2rLmZ>>Z2p}VeZ%+6G*r@HmKw0*#(JHh6^*RheW8*%YpMF%;5wRi*KP{lm{3r5O2;XS2JweSm(M~VfBKj`(Vyf zpPbJGCuO&kkn7n{H5+AX^!ew)SX5)JUpAN1XVvAS#wHS*N+;f7z3XJ2=Gf6n7fPg+ z9gZfd9)~LR?B$Ft(fOERVl0pH<*8%areEaSRbEy|Yp1cit%vr!*qn z36z1~Kjumc)FX)0)@25}hvk5|^23$?J7FJIZCV)rNj2t;Eb z)IzfIqQiLDa(T|Ze<+9|%h5+ELm#Uc)WPP7brV$&w}pY`IB|VN4=3N8tMJ2Ut#ixR%LJM6{Zq+RbBR9v849X0hCq`Qwt;+#iQqPetbK2>b7^Qnc-M%y&*kxhl+mZc60 z%yNq4c!WW2O8166i3dCYhRM4Lm{Mg?Ngz3jOUW{z)1cPg?|4vfaIA5Jvl(K-%0BIL zW?;K?E>wK_>dhXn^R||qAy)b#@Cho<%w)fL2x8+$DGKCq z>cHbxy|-InN_4;&Y$6HB{K!VRuPOne8^$NHA*kq4)|7m^bxM}2PWpZ z5bN+Ny)^tycvfA$Snn=H^v9(qVy$#Iz<#XM^O(ZIb@0yMp@`DJ#J!>W6qxve(7}n8P!*BYfULrJLV4jIf#8 zDK7|;j6G7B34l}1wT4w2s4z}aHy-9M1xE_(K5i$oi96mRWPR?J5(FeQ3E66s?B!;> zZ(Hx9GD!C|JP%phjv+zXB|1-024uvGtRNh>EFZ%NpET%P7iK`%LeFZ)4EllYz`X{^ zHrXQP3IO}jdx0#(+6{5{QJ3f(d<3i~hc&oB;~NXb+ZJ(zv#ga{G6VwXK6g^70)vN` zb@Al&-;0YqFrAM91`v%#`gGCHlSUitWapdfb@gQDx9fi(fanq9Y5Hr|=*DnEI;f_g z-3#NF2$MUFcNqR-7=i11@kaabo7W?qPs-%smE?r5hO<+wr;}`q;X?`yYl7(-`+Id2OOpJ$(4@hF zLdqaT#C`k*NOBiJ!OUQYn?)f3G=coPZ>nX)KQd#T0|%n*M#AfkH&kDc*kG2}&oG5Gs`QO~!S>A;i(HZTtiw|y=qn<` z-z!06RE|tLiQyg;*gsNLnd`MTZb^Yl4m4RN8m6i|6q1Q3Wdg0ogoe8 zO&vf%pQ5dakZGX^dQvX28VB>VjBGFqH8ksQOg8FZ>Z(CBXhm4zc#m9a_i!pT&?M38 z)6SyQhXgjmP|L}RtE{PzIAq>d45~gt8-?x|^%23-=V(IU82+^7{1~d1A1bS zna$9aiwTx=X_iik!KR2ruxv#f>{t?t;^wfO=3rH}NqtLEA}hyv5Osw0QNd@!U7MmJ z}yo0RN>nu^BjhYWEK!ZX9?Fk7~#z;{iPf?Aav)h|d zyq!^!p@#Gm$IPMSC@a}?g2Rl9V`!Qz8{tVi(E?%-TcMFrm)jxXydLd zm68u4a9&-1%B}joLJQqr*PmM;LIx4jo|j}w=-&M;qxK+HRvZUVDhF?~{o%d#VPb*L)aOC)|nhfo(qS{o28LwHeQC%iib1V zeI+?K(780?F+8QEwpyjA$3wXcf!O8XA1qPpd-f6d40TGaCf$8msW? z9m^Zs8I5a7oAQEd6YW|Ej$2~w5(~;pBkdvr%6~dS|H6@P?Hg#FI}Yz+YzKdBKMVPF zR^EDdoB+?%S*71qHP@DR*ippLMZ$E!b)wHy(UWxq^3m*0D+Prf_gWtGDN6L;?Y@p+ zA|fh$%q!f2Px$jryhQA~%9sYTPKGg4hpX&I{Aq@-Mn-sy#^z28PAZ1JGZ_IY2Odvc zS5De7na8*6r)a_^x^brZ@+Ko~XXcKlSt`}lPt&;_46Q4BD46F-nC5g(qvRc0{h7Z9 zpGJ5yFGVgaMV`vmGk^Z>0O|%;`jj#+mNBmWtaMvFZ5}$c+N}(|I$c0KYlN&?OB~v? zW!gk_-0Eg(g<)+r}ZA(vHYvnzAuaQPp$p@a*5@w*3M3{|Kp9={~spyHvdP6eYU&sE31Fw z^=}3Hw}SoO{Sp6n4tOvC0-i{^CZ{V19_x+Qzw!E`H(nq8#_QjB{Tr`;No%f8+IUy#9^XzwvtbAba!-W`s9h|HkV{u`}=9c>No%f8+IUy#9^X zzw!DvUjP3IUSAz@pJMc`X`#1C%q99?y#8AUtLD2XmsT^9FLQlDu&(hT(VHYzHQf@D zu8AqHygpsLUm?^rxsczYM)3P9uXp|0kfF@zv^Z>(brs%)+{hBQIAXQ-KeH{P(}SKJK<6UYPKEOUNs)kK#Y5O3|6bbGgZ<7C4OJ z&`nOZR4HJ8<@M9kQ*Z+A#h>$SR8p5_UV&tZm5;4vVcKkUXoIAXL5+4(*i1v8N0kll zvD~q4Y}K7dO~|Q?B&Yj=Ez0eWS6;7*^UHCB#;G>wFIygrm>q!Oa?U%Vbn!CSB`;NaP@ymqfCqkJ5*@3+0Y{->(4o|VtZ`krtDPO7;K z&g|j?C;ui|Q&T&_n0=Vo%GTc3=FS&`%P6mmW&Hb3&0>PCiN~-z)UOK$G}^D)GW2(e zUU|LF=~WBr;vR3m_t-s?Th{isJ?Gh1UN7j5eZO+R4E~^pMFA*!<@HKoJ~M@a9%Wjq zM_RAEzMB@P~AuLmjC4S)t*0> zS1-i*f9XsMe(L*&*YnRKefc!x#&&6D;Jd@!;XURhc$QS{dyrr56`}`DJ2d=^ZHy13cn6nL71>&TV5O+BLBd$fKMyh{85hZWq|QTjthL<_Q$NVj-uYMuH&V-14f@7TAT~Uz7zR| z?&mHa4S8XHSGoCIBb|5#M)M*L6=^!{1+c=Z|%-DrK$6{x4oHL=-LzO~C`|wW{YK;FFLt7eejM z2!Mx%7U|;{f%+T0x9<}P?sJLm!%vqy>&YQl2nsF<)SZy5kbzG}kWz$}bgl3A|M9~O z)PofH548vXwf4wF|FZTMA}+1{A;AJB8UIjwjDc5bPp>W=3i@B{-BnN>+PdiZiMzYI zyGw9)3-0btfCLK=EI_az0fM``JDCvNg1b(f;1-y7%x;`G0%JwQGZdoUzl_H({`t)zVQ$7gCEw@sW{ z-se+3nC;k<{*d;yJUt_1FtdIj6?>@APe7AdyztFX39>+L2vP`MO;nIBjA^ib6k zNx~YgLFRm;)GbauT(7D46-trXV7Mtn5shmYNou&cez+~Mu2G4reS5fbyQ+nm8|HGj zhk69?W02C;zDfg9LI&Kz_SEA24})Pplt#8ohN&C- zGz&s(1Hq7h=kUFQ!k_T{dNI5l>Bm52m;3(;-=D@Qhvh1V|9kizK2{qM07(yk;s@x| zCk#PzO<|9s_Nr)ZDcMONYujT0n@88ni55e8gPN7wDO8`R{gvaVjen>;yz0lN?tS@K z)SHos5tY;EaW$2@$f1w5*@o~sscjbe&FQ+tsoY9IN3q4u`_qV^E#Y*>>R z{>7NmZCE%M+<&Njyr z+TQGswojc)@vr-mq~|xHQ!=Hy!ap7a7?)~D&+SlktcBNCi00m0a5vAtQ-U`#R|o7B z0B&i>cV>Jl7EAhyTeM2cIzFx5Wvu6nRcS>ya_Tgn(f-l)q*WdNo3^KGF3{ontlv7C zJUpr-aiw%qw`2!go}XGK?_C13q|Y-GtxWJFP17)q6$}qGjErj;^#OG!EA&KO88KU| zEZ`)r2usbOj5IeGF6^vKl^e}58nFx;r3tTYR)}qqj4t)n?Tm8mc^cQ%8RsOdzRFu= zA6`9_F8vu=dfZTVlEk?NvsUeBJf*P8%(X@@xprxlaH}PLo>6xb%6Xr(c4ubXjm-Vv z#QC^lLWQ}uyQ4HKxel#u+Jm*;Mzr3?Xj(z;*l1equx{&T+B0OzDZGvZyMc~t z2C%M0T{XRB-yyJ4H>@@%uON5W0$-Q~XPt%5@RoPp)~gs^$)hcBqJ^kRiEtsmB&mWF ztz{{RWhTsdC93W{)YkLEb zr8dwyroqPA*cMjJE{w-M)69X?#DG@7>Dt%@1S0JR=|JsXu#Cmvfc#W;S(YDDB zwt4Nb3&`Ak3wGvls~qyhwF>CB;XAicDci+F-Fwek5!_!NWXu@~vJUHH3-?kC;kB(y z*pvTYYdyRBF-BOda?kGMXQzQQiHFKvahoUdLBQcI{7ppU3F>Mfm%`Ov9)~Bb`eFh1{cs z2II7h;E5QAK@iiLynOWoMPOCB6W4{l_f?mfinaA_sjwM{nfl8-k(9UWn z-z>=CsdHvF>m=uVxW#&6OY1D6eIkK%qV~xd3Us`4-MdS>bI|B)k>-rxd=ho&Oo`&c z+JEB7^z%5m>8Fb2Rao;GSoJ2k;R3{Ui>rKJNdF7W@F1e}s7()ccDkgcy@R#B4&eU{ zs|bZB0nx<;J*NO0YkmxSs_uR|rS1AE{j{Y0l!^K@Wcal3=(Kg^w4&Vg5`2nJ?6w%= zy6Atjje3SHnuJwljq81;%6N9@e8v@awo`e=7jjAfw?kxOLGEoqadY;8*4<{zZJQPB zekANJ?Cic9a8A?piDdVLy2+Bk<{U@Xf$6&wBibpwi3_u+6}t{E+nP3OtP_`x8v&k& z&g^-p<^>C#hl0$7ma_+6_`YD5im=NOf03IA+3BmF+G1?h5~3ghyf>L+9#VLGqFu7G ze6SB#s!oAOxx&s^yn zcp?1u{8V{OIpnqV$;*cB$^mWHnQqta#@3yU-<5CAsmfCY&l^qU+D+5jO7_MJoO$ET zd*g*y;vL@q7EU5yZp^1?*LU}rjrKO!TU?0uHiYe#U;8$!Y4gkj?WA)U;}UF5z%)hE-XEVt^ei0-J^6ri4taY>hi< z{Qkb+zToCQ1ou9F?Wl(CsP^Yko%g$j-#+zCt}SRzO~3ERP<=72e4`qD^S=AGj=OZn z>i3K@RMYt#hx*p7`O0%WH2wDd9^2VYCR{H1;Gpu*XyO;d5$aj54!+}nSCES^fS-?A z50Tr0raFa&zlB!A9~&J<9ft!ngC@V;ld2EXBX4FNkR&gUYQhB1zkX8n@e<*fIJ(vJQ~8*p zj7|sjW`m!fRee5t>0pT#)>Jvz?n%{WLC8QW%gOKlsJF)=H9EXzS#EaUox)jcWHtUM zDunZ_>ZM^2YV=*-KB@XpQW=Kjr5l&^_5>cz49AvQtKpD8sy_DvF(QNEU#cF@g7ye9 zpZs5{Ua40bhK3wnZi2jbq!(hDLabEVFza}xFbLMUiliy8L*F$?jo!wQaW<=}Qi5a{yVQ#5YMr-aE?#=Yshi z8I#}^j9|z~QyKBs(G(L1csbSRhJI6mHOiimiOdpemE`&Nb`Vw6QYDJUhgDNLlKmNVz{4g<8L+s#BFaqRiSa=l_@yWCTB@SOwB^=Z%Cz9=YrG<|O0~6=3 zwH%Y~Yj#PqFjNlX>vv1rDkEn~k%HxOzqA%hVvDI`;ersMe@dU%5;?X0#@uBER}?+T zdTA$kpoBOJ_qK#MGW?~CIE)%KV+o|JRCS?wrGYgSo-GeMokiCYX{Ahu;1cOdr?G*&wwy};*%42IKnq80TQHlx!l`l=HeWX-JAP7 zg@zN0sCFcPx#;jQ{*%V{kDR!8qdf}ZaS`NXO*oSPKL8{Bw6AyDakY0+WL( zm}bU+uXuosAZPC%8YV@{cz{3I`db5S`?r!|18jyU7-V-NI!#C?RS}1jlwbPMKLodD ze=u)`hm`}x;XtqBRO5@GN>oEaM(jx_B8y?coCAZUFud8@rwMpGO9h#W#nBFey!|FV zq==zO-fT=rlHv!#V^)Wf*Tl<6nWtF0#lNDah9hWJ zrP7wopi`e@LRCWmQ0t*9AOaJPO9l_+*QT84?9=22YIN3&#ox6}lYc zQbQn#8ZZIFx84(_^oA09d{@G@A|WYcTJMb7d?0KuJ{F63lar)GIj^8r&PXm@LZPS0 z*!EmNRUe930Ue3qCZEB;*kkBQDhfzrghmae_OvQW)643c>SIfXDPZm zY+xdQy+Be_VXC6vvBXf?N{VcErpjLHX^NGG^hfVWiPCbOb)^Vls6bWGgoesp!ZM?z z$T^4%o+`>m9g|0erVhl$YEO!CGl-~pDi+=vQ>4R7!ozty39s5@l2}VNrpb{=y6Q9@ z2dmHh3*(W=^@T7KwyH$*w&^2YQa&4(~LUJqejl}G8I!cB<6x=I#`3EqgL7!ZmL&SDqTB?sLz7=#1>iDe2BbP zH<*hcU~EgUf4T`co*aOpci+~8d3x%i|fTMR)b+O?2)*+iuA-x0KhN@LZCc( zdQ#JzJJ>(~40|_(X{-KujCaRAOl7#)@CF(g9gw>JBtlY}BoH&U^SVGq{QMU&nAVck zxMeWNA;A<-olnc2Q!P);4k4kQ(n32MEx(Lpa@W`_&lXk_-663Ra*NjuNn0IcW=Ims z+}wi}a~hKFXol>d3w*D1_Hiv3#LeeE>S&;8BVtjmo6MEQJ)!fks362TkxEe+^vTiI zf@ryYEF6hKSzPG@;S6>Nk0eP9mVpD#DvI$xa@T^Z-x{zc$0X+&erAB`?uUor zNyM76NO@=;6eoR>n}$n@Xy=p)U}p(Gf?7K;Xr3k)TrW{d{KWn7XQmf80If$)+#f#; zhQK3?WfWv58ZtZ4UL1_rOU@u8Rch}aK>}4xVRxWMj>oY7_p}*T64eAPWjTePJ5JYwrM`3zfY$T@G4`&wNv0;cxwJ*Xjqv-kS{3 zmBY^ui-U+94T`SB_F8Du)D_p4@*(YJ_H}*~mt#$-0fmKLbysQZHgXw=?sV=;UzMGM zu@J~I;xG+?&_spJ@tlu|udQAImT-NVhEcA>;`4N3n_oxUC$!J;H%reaEZa_F4^nhs4O*%0&UzYPF|+(P&PUC1)&;@d^!=JOtt6 zYjF^_XD%LaF9?oh>ah2c7q|0RgU)~EEJD4+L3qWmC~mGtgtunR_;i}KeG^TlB{~a; zBJ}X+QJ&QT&{ew9wb2C-_oGL^h?z^ge=DwSy1!h8c|R%Y2f$RlA66B)M||hE9Ukjx zrWN3uy7n*>pYbb{6z*#E%8X=x#}IJzb$cZP?(wTcw=rPAICa7pFrVouKsGE+_Jbc~ zC^h6dDYH(?L;@_O3{d)XGn0joyDp*mN!*Vd>v-z^-6{YRvllz0SB(sw)b!CwA6^6b zMm=OHDC?F5`Yv_NI@<(Lyf(jKoPdw~Fu1n=kz7*%8eEVKb#4OC%@n&tze)TEqEQ9d zuh+YgQz)aN60Y~mq)P%eK&BLu=o>qUWXQDR$l39~W)OdkO2gp-f9$PGhmb!CWTPdM z&vtJ}l#|csqL2s2BlG5%ALkh2kD$Pcq2g{5Lh6yzLZf?;jn8Be$B==(X05So;3t@+ zrBbZJ1FyJa2{p{NR*x{1WQi6mrxkwf{h#GE^I z5ca88zd(kDxrxn44s~GiSd)2(0EF)&ZCdI6ur8K0noixQE#4b?Wg07FZO%*!#0fCR zwO7sYH%mM+XVciifU$Um2+d)#W$wJLH zWZB#jc*>FqWlus(6GA+x-gewAO`RCgk{_hI6$zgJi<7MsY>C4gBAl=d6+9tvxdjcj z5JR<`!m#qer_rF!XJWO&GdJNB+-8=bmYmQ1Eu1E89Kt3+saS~j3O9^tP;YT^;UN@E z0~uh+20_S2zWwe>A>%1)?RG`NiBBEk7K>;t;3#*MQPujU-LGZE9 z>}#JJ!t2&Fd4Np`iROTEp%}cTGQPO@3NePE6b6t8B>^A znq!n2FrpzoJ;k!4AueQ|N(@?K0F^6$wWy@D6g2XJ-DR5Hwz?;s-QTvp-<}S#2EgyM z?}G$2==M^93JueW6nQ%6MfRWqfh!%=$EP+t&gFcO!~nMP0=CM&=4-?WX)txr8_2vM z(mjt`5Un!ECE%-DW=Noj?IVrNpb@l3z@7)L)Enz;tn)(8+>Av6D&y;H-hx0_$)RNFbyV(kc@YelsO7Vz7s(eqIMsSU}LN%+yF9C;2 zMyC43&>9Vy28I2GMdii=P@~GBwnABxpnVe}Vsn^-Y;;*ta#@SaaBC@UYc6GNT1so9 zgLFGn!w6G{y+db0a)-TXyC7cY36s<%Qyy%2w;*&6X}LE8^ScKJV}9mupkx4{BT&Jy z4_CXlkr?QM*Jte5zp3zD`{=vzk$$uzLE2Gwh$ArOiKUkhB^-V2EpJyT8VQ>lPKF<9 zv>XL#jb-W%C(nLW1WvukLm6v5PMrZj1oSZyUv9ijt3aVH=VOhJb zSOc@H!=9|D6s_Y{ZjiEW(pGM=vTpG@ZHcgM%T#WwuA&T(D=| zzdi;g{VCYzp6omo?EmKVe+u@i|Kjz}1^d5w{TXi6A71~bV9#51@lvpV;r0KAc|G6% z6J9U)(xP8lvk88|@-JBae*)#7_qX#9_mq7CjEi7a_LA$=I+ru|yS(94v^eKgTUXQZgyjul7O%aU`-D%v1*R|W%6PX*N;r8w zx9Cf(Z`yW*e=2`ZU%lyXq6=?-s;DomVGeqC!vq|?$6H>96Fuw3={&usmI9!KzXj4f zx9FEQ@xH(9=jn8d@m}5{gL^k1Epi^Sl)gdN)%Z=m(>=Lqd510hsYO5L{yA?MG@*Sr z;@Rnud9%DLO7?ElMdZ?Qmw4|_i@x(sEKR(u%!&`8=A=9D6imzwjr=RQ)x-v-);O@zt59vEL4l=;`nefs1sw$BtKI0($J=L=^r_Yd|z0LJU4P zA`8v`XhrzGHmTFOXx!`oM+1(s*Z8_il<)X3941r=aP=*xhXOr5P6~SRraQc|DfIoT zD(ZabK;R}NW-ZLFqR7ulIMKQy(KZw%3W{=9!xJj2;E>DgU+5;jw>xN{vy@R(Sh)f0 zu<%DV9!iRsw_V{;U3XO7%w?jrsW740p`M75Y?GZq>muYnosjw6=C8!6d;V~6JF)HI z4?9E=PbJ=;W!;#DjYyYie_QZ%v1bcTAby)JgjFvtC)xA$-wTz{JDZ-p`2d#EoP zh_UgXlj{(@PY!%lQi7%)+-qPV5%?Dbhwpum&qZkOpi1^t^liLoF_h;ng3Xeq(EZ;n0RS|=s>wj~*(zlm8&sS`=DVSSVN+J*6> zPIkFgE)jT|2Ygj0#qtfP6y0e)73(P3tidf!{z0huqVu(7pY{=-nq`$1k#v`9pMHHG zs$yT8L7%~PpYgJkE|5+gnqT9x&zxH(W=Ohgsn5c)-}-^gbeqmhDg8Y`x95d>%x%M;pCo-Pvh!Xt|8K0N`7zfyTJ;*4rk#m>dB4lzJp-D|``seo1j;S#?3>ZDcimR4sto$1aLVPoDAHP`M`4mvWXELZ#$- z`3NEkeTEo@UXhsjLOyPImV_8F$UsvBz_Dw@$t`O9L&7;eJWOOl=hxaU=#ic{nJ`8r zaF@_XxS~>2;B&2=!H)*^f3LOwCCD)+6FH}tmCrGimgDHQh-s>!k)_lVgG{lROK}=P zlmO)9Q0_|53FwFW*v$9XbL)y_LR=sr6-lnqolAuQ_p#1XTvzphzfkxD0lZhsC=(~i zbPN298A**{R8VtDsi71v*Z2jHt*Sf$YNdDvJ8-r>;(m`V&`<%!DgQQVZZGSDr=86Y*V1>c}$gAtdeuIPuf(PsN>3<(#{Y zT1z9tFvD2A{)QZA$&B%g z%cmys{=(%8KhPSK{*`jah2)vyRn(N$8sjbK!}rtx`uu2Lr>aE`6wRGxDi~+}hnS}h z{~dI<8+i`8GrY#>7}A#3+SSl1jlXXv=)(!;^&@zV-xww<=#giTk&PEMn9`9%V zM94DYjPODX^w!t0Vo|mB*Lkh?T03LztaOh0l_tH%Tx0{4OrNf7sAivq4#zLuI3vFJ zPqUj}wY3uGxe9cXa1x`O^rZatjG`C3GW604s-uk-;anHYNv*fTuxQh8w4rFWd1=hwpo3>+ zv0-J&Q($_AVc2LT%)w~fe+3v}G!|;u+_$nNy}I4OzmlQ8dTgY9w=(avRL$~b!BY>Y zwR$vTykxa1cwn41YPil~Tnl4-*r#{2vU;gyQuS+<-`*q+#bkd+!M}91y<_#NZ|$L= z^~Q+`>_69K8cjuMtbSlPp=DqrwGIttf9<)t>yHMQ#e)DZ?I@?BweAqM4vn;SGqgTy1KDLZI#xE=i5E{A2$YqJ1^VLDhrZdy#|8{<{3i`rKLFLT!7^-~%}i z`_LGB^E7+nkpuNI`_mPB*+cu!*L!7S$N`^RGc6X%E@?9^H&*`8 zK2~*hm`fH}J#o^2J@I5cp~F4dFy2{1-PzW5)^*<8>a^Jpa31kIq3Cp$`r%}|e3EtG z+<5P-hU}6vbRtRQA}{1p%=lA6(M875rApsL!q-LY>(98-pM|Y1oFhM@7F}`=T$mnQ zwDL}3Nly<>Y$u#gAo*PPv`#-dyN<^Egh6w)k8u@GKP75Eb*((@Up?I&JM}m@75R0F zNqkn0=qAGChNyIADs(1n;0EdE<`emp9Ce$?bn`EFBMvx)iQOlevn6wJA|1B`Iqwj6 z9TAz(QsaSLDcC4!bhxOhxai}+9Ue%_7sV$YKT$3PDm_pM-$;Nj z{EROpb*d!1HTk?RkrdwCgkFkezES9UV~2a8BnwjRGM2x&42QgOIk{A)yONQ$*ZSR{ zAS$Hub4^25PjAge7mr2T+f`Hbiv7ElevyqqilyOC9@DO!JzP(tDjQ=oVRO23YZEUM z7aMCAciSv0dpH|AI!Z?u56dhPr*IF4IT_b1YnP@Ai{0xQiW^h~Z)wpROSWqsyc-$q zjd$Q8Z#J15pYJz5?<@RvZ?HvL0^r^vSMCPVy|rGx36{Mzf4B*;d23938y0^1TIlwv zMIT~tE6p|TnX=)F=QY;(R(kmMtqx_w?Cs+HZA19?qWu>@ekC(;a-LF)>OYC}gF?N?M>ho3A=i1mOefMplO>=72b*_nX zQI=1M34hu6b+PPy1=_F5?>==fz7=ppN#7TX(C%x)oeNxinyY-8vX1Ife%0UHlMns+ zUg)b^=UW`>+nx0*`KPY|>8}CC2S!D|qe7C`x;?{*fA{7EJN~OT4^{=hM8A1Bitqz` zc?c@@Q#N_HQ+`}9_HS52YkX?XXZt-h=f6Mc_;}?f9iNlv|D(u%iR@9(_z|BqJ>cOx zE&RZz3Ava{xj1b3Xj9Vg5V?=}asYV$fu@Klw7?%fuV>eMYlHo(Q__-mzb^p(6kg)rJ7mQ}R$mNIb-Hv5oZ}W^{bc zZ8P-QUIV!IM;Q3SaKPslJ+s~UbBkUQ(QyBqX5m~HWWStwj8=t2DUF) zh~JH_557ORQJCo;?A; zm6JhPr_2vmN1rUUI-F%*ui%ElG8SlNH&1liHJ+%o%K1Qy&cOT^jYlFQJ%W__hsKZe zXhYJFvqvbJexUnklSi$Xe!a2OiqbEw563zc+66(3!paT_h=$}L+}=CeKiPwGQmk@* z6udrSC~-jh>X1_j3F#dVV0Ar_(||M*qq{RQy*=A$`#GjeR{r?Q6i*VlPHjY-l74#H z?@7l?NFv}r>3GO^^)Puqm}+eU$c_RN(`BmMS|nNaxEd}yPf z43eOvjKSYtjS#8CEDj1OG!V}cmZxTdkY0XpBEF`7+P++$kZG!jmU;SHwmZpoxqdq$ z^p>34nBH#f_ufU8=8fx!@@Cke?l}6)djU)sHS$pDAh?V+wbq^9e8;BS;8#olN9O4; zac21GUa%Z1JTOq)1zuCEFc)#Uq=PQLt+ex3<-(8 zQ~?>k{D$q#%~Dluxo7!9@0m+C6rP`JFJxa1<~Y*b5%1Dx%FN~j?(H0N0CVuIz{go$ zyQygiO(T9lY8_bc2)5;f5f^E+CsHgf!Zfpsz$m8KCf2mu`RXX$M)+01!;l&H zRb^}1NnllXF7{i1C!E;ZrIFo|htiJY{JL9#D5>jxYAx1@opN8YR}b1t(X9Hs#D zVo}V}qbO5DywX$M1cHR^4-~{XzZ3?(iNk6*)#(n9peB4kE(aH3JaDN1;_`v({MqCH z{(Lb^yEtjygs5O{GrSrg*(-in&IAEDbX>|13RhEjGF^CNa`*7oP-|p?TXDSQKsZLk z_z0P!Rk}}Bvhr8sp~PGWWYUnb0*t3lIn>nLDK-tP(2Udt#RhDocEr>b5V$lEq1e|G z0GvQ_c-0(GPWeY=Rnn7G2}UwWc*+EFWLtV!ba`A*7ZQ5q()&f$VQ=?4lntTrhLFu39d~onI5%D%LH3ayd>b#gZ=u51VhJ1-s1-BDIfSj< z5bGQu965XfY???Hj5B7iv_D8rr4fnvX`BpIR!;!ItLPGbv%V1Olu;sd#cVmu~X zBW{12MC5QwQ`%m~Cjej~j78FXiu2)=>K7}l`P9V+YGz!dS;uj~8W=98L?TG|%v&QD zr)2VLlW$5A9440tCA1Dnr%A43eVX%)`KaNOAV=MKtQY`V+mdwV3yqltfE0Vy`m;JY z75zjIX8lpgvBGp8?Nt-TYmi2+-k6a&mpqWLf3<7@CR>6bt$MFJrB1VK2dmcfM zYauY2pk54_#ePfs<0MqgcHRd^2b~oBDf<4)-nq7Y{F}B7?2?)f;T2~mq}(om+bQT2 zr)ld*A!;Ygf%HPI2&ngwOHjYdMiID9xZub~O{KlZbx85NJ_A=yJ1^R=Mk+-Pi6-Q*xpQDDcRslg z@77L%Eh?bhnZBSI9l{F_R6%1hCw1MCw_wUOeV=7&g(8Q6#4sLRBDm@nL$@)%7wFJA zcKhrd_w%aJ6u|yAjvK*JIV7b;%(m037>_u105z}{LG-*+k`y5BO;xAk{05SQdP%|N zzV)k!Pb1ROapYuP7c?Y$6c-R>mr5}26Ily@otfqUHn1B~j6EKo836x5U=gM^Sdz`S zeuWRIYm+pv<-OLaSC){}IcZ?WT*ejP))xTjf_|wUdm4sj+%Lc878og$=V%7=s85-6g1!m{`wF& zbR9k{Ywv*`%DqdzWla9Y+e zt|v%9@yIbba`_vCos?3Jl;~dOz9rqnATltf{yGfE z43^Ox@Q}kOV&>|%PJx>%=SYP}Ywp_tpbE>ScTZt0O-+$g0|=24Sd;J~Qb~O^1mqk3 zGBO^vni%#RL_vl}9Y}@Fq{&l zS$iB9Nn^~ay{#h_Cs<1bfZSqC4iTENP>h6z3=4tvB-K5pvc1j2gV^!Np(e(CBcv}L54aZ1If7`qADV^=p$9n@fwG; z+5ku4{OFDx^^Syu)ay+u&8ZB{P9m*@H2oM#bNkR90YV-b4T}ImNwtsS+gQLPkdWJ= z1b&Zj4K)D0M*=&jsfXMa62PFIF%w^CC`cztzpG%-1VHstfgycB>gnyK55cWhPoK% zDZAj3MJTzEs36+;}X>39$-skFf5!iq2UK-YHAvK*AuMJTue8_ z5I5&ycSL9ppF(g$QG!$v1I4aoXPyozwAbtui`#A_B;YM<;M;qvcaVjqrA3aAd-~v_ z&-w`3+R`abp|U}Va#ni8h*BS6se*fTo|E@0*yox>a=Nw(6`G2vwBd*$;Zu8DVS8=l zhR$AgZ~=Bwdp}ezi_}}Q#3!&c+Uec}godrOK4i!Vnr?4#Gxe9f$6Z#(3=} zK+F-SPQyawlOVY%jhT@t+6mCW4_e1@*5f`6CrzG;kRIk~eJ3*|mN~}bISuUDw5{Qo z^sI+3SRU7=2G@lH&$|ZiJqLbx4Sp;K zK}rol76)Nb4Pg}rQBw_37YFh88sc#dlDQg^wU-usEVq2h|6wf8@;}D%u^wVCJ^2?R zf3>>xLgb(M`~PIU5cwA(UtT|Je^}8BDm|=hzkVU|FGQZ=g~)$+A@VOo{)NcD5cwA( z|3c(ni2MtYe@88f!tbe z`gD$}HQL)=hddK`3=8SS);^={K5&9`S6-hncE8y}m0@%RM0=6)NUh2=rzN)xqPtAA zPkTgEyR>DUtzUom{kKsK8D=aDN+!_N#FHS|0O1hwn85Ouyu_q0?)WO6)?KF>;eOzfc}+ML79L zewd)#ho=U>Cj%x>!}nr-+77TW#0IHl(<3M{aw*ofSATlLkqeFdS26v+=k5tTUu%20 zmA+sq3}}piJO3%ByA3r%10XrGo21AQYBE)Na#h_>s*eV_s79xtzpPL5)%)=`v`4rM z65}HS@+jzrEmiW=@w`e#{=x2f&)6L=v%a63N@c^a=7(eX^b=S|NDIOzj8}r+<%Vx| z{PfJ+gPwrKU(6l;1{qLsHhOv~e?dK7PC3!XsRALU5;Y(;8Z@%oPC0-~@~d9u*|?vL z&mpLZN+~fAjYE1?qH1wmEJ0viB;z60~mm0cf zDHIMf<_uClcMiw9(ZY7sfhXBsJNj?39ZVqRCuqK}9}_^z7P$C;oQr zdQ-pJ75{PVr`r>}TN*4RiGrV~*!qw}B!&RDR2)W=^GZPRv@gZg_|cPJ${vW~FbEPj z2%5_C0lEalIBM%78n3kK6i1naJCG8Q0ouKT&XG#te~b1!u@2P_-88@nnx?-*JLU*6 z3ztyeG*izE@1|zkGiN7_M4r(gnK64xr<;@h)lHXfi19f1H_cu;qcEecJUXMks5OZg zXhJPyfK%sktWB{w+j1~N*)~PbHRoX!@7=)YrX}Q#!u2k6?mLFM23T>z{_771r8&Rj zsX(hT&*K`eP)^Px`s!OCUfD>V^TwI2&~wQF>B4|QHo&l)_= z$29QtA}{C>FSxVleWsy|p(%4MkcofPIdjxYfua0zOdj3G@yUoYqi;VzI2RsQObS^y6Z^ z)>1|^V4V(cba z?)O~IdbLa*X$WL#s!?V$2QH7`a0qG{4t11`2{Vr3tV~L?gU1>S$7yIMXc(ugR%Tgb z0)>sHX$l6NWM)3`E+(ze)EXImGnyY=NjNa7SzfV0T3r+V_|%Z!z!BZySv`+7@{wG1 z@?Qm!%qB6PXTD!<-ycT|S+aPx5 zX|j-OqGPbeHoSJv^5vvst@xJ-I4R*#nG>>d^6G? zci8M>!v>L89%&^XdA|w8wOJ0$rl64dTg6Sv{yLf%a6QSYE}gZxX2PcIhs~^tO$O3v zCg(+FR36rAL-tNXHfuA^+0D+R4L7VUN&|~dr!90v3qN0r+KesjXp2d%Ew0rl!P!0` z)Xi737C)f3owv4tms?_$%P`;$iT)=a&ms$&6PK|J2-=<~-DXYRmLE%21ocaHa;xC# zs*x(F%4{mlZlh~iE?`-`HQKqL-cfMaasFfl&0}@tzw=uAqaJwDAi&(Xe`o8;O613m z1v1D)rcl4J(aej*3Z!n`SZQv|ZNvIhl4r6%v9#p17Ow$Cg<4B5S$}%~)gapF^n)A= ztKBjn&X2j6~tN}Ak#iN z+W6ksI24ud!>XX6(w=6FaQLiX#5GcI7+2&|WFB^JG0pg~nkqVg>l3VA%*kG-K2IDj zLP9b_awTWH@x1vxQla~PQt7^T*uI*|zIx97*J~rKYdh`L{rY{o&%BN4vy0gxI;pcM zjN%7wng_zZ_F)$G_ihKp$*a=+_DU58spqyIQ9DYEn@g>WeIOksunu8K4{8fp^D<4E z`Wx#(?G2Sgb);(*ja)6b&Dm*rZDEIr-yB$W9Q*|jM}Hg!5;^(`I)>^y<{%zf;|_Js zw)H#je}|m}HXaT(9!0M@o&%2>SslTnd5(LZ9DA=FD!_-IPu5s?okmrT?TLB6pL`B* zt`c#|t~`n9bdLIRV(EASvEm$fax&v}yaaX%n>n7I4b*<>EM4HROH%*I#jG=A zxJzrc>!P+DT9fOZwks*Dt5wwLdfh3Ss`JlPOl0pftfB^N9Ug+;I|#dWcg9Zmd_S*O zT~TjzLkE8Tc0MB^J43!Xdu#-|85X)?!ktmArIN;;O;idI>TD5vpNC?)*TtW++Pq@g zt;HPgqm@0!4?q8K?oKJ|T950Y4Rp)(V!-|Fvf=!Sosa%iN+-^^+eCr~DcL!->M4!r z4xj1;GTs@>_&E>X5$|s)3E6ZE7ZfVlOU^0}nKe!!I!od33v^Xv`JxN9rZ-El?!=Wf zlyIKnWV}kdyhL1{b+0}5Q9YF`ub}2!X~;ZLeXc%5UPUcmVVqoHg0HYTJ74GeYHuUz1$j=J5JQ4ZHnE}6DZ?msA0dThl?KgpRxB7pGy!tbdzx_aT z`#tnF0rTDHt#-Ry-U>5 z`66qV%BGu!XPxSF_jT?r%J=SbmUmW>{nxd-9J>3=8|!q{OHUae;n(kSy?tW&dG)vF4UPpZPen9^|<@&x}b0LX`xw4C#t@74S@Yj~ouQZbM zrWAxG8(*9lUziMEhzK94Z@+5SczT*_a#DP&b$n}z?pw!wTPYucGWpXAepS4G=<@e# zn_KBf@$2HV0FQK)54$|n%{+Ae_Em;{95OMSCbRpt>s!SUiUU;qyEach^`Eu*fw^(i z1vtPW8T?XFM&t3r#9V(#%6)dMUv*IEqIU#Y;G-@%?m&JjP;GEu6nxMXu*pWWBl~zJ zCF|)3>9rgYEHn^eI1u*Sod52B^!+_FU?bK)iX99P11}&v)I9a%A>lBYZBNO2|Dz{g zZhJ=AAB_VAjlO=C*B?ho)3`|w5hP|vOeBQCA7}wUf`8Awj(-3Pr*4BUMxo2uJ($R3 z5W{Rgz41MkJ(kmn(Y549v5ZM?`4Gl1%m-{n-5s!QQ1Fw!Z*||MK*t?1fO>zlfj=BR z-ApAgRH2Aby3&qSqRj(IA4eYSXLb)G#qOSDrJnyj=>Qww8;=A_DMcZR zYhIia;(iBf5=mJzpDWjof(@%=j!X@y1CGgo2Ov1u%Zt!02G(>V>qzO zBxQdl?7+8@>7R6kr(~zu#8l!mN~MuCz}$vVA|uu$RoF$5F3?n~y`%l=W)Ewo;chGi z#ilJDA8u+yS#SBr*h{=U7%a-5tk|>8#ZX=-mgGc~`anRe%n>F=*Bv4uPTzeQC}z_g z0xL-kYibT4kVwPGD`UMZE<=)Ug;z3g9o!JBcegzJVnrH~pU~DfbYS(3(3iOuY7#-C zwpK-b1`|eJKaOF%_m8o6p8(9dV>{Jhu;@EB!}sW))C2M%J`+L;0A9n_v(Twwu~+oO z6K z=-_U_-QC??g9q2(5}WM*+4pSiZq=z%XRr3u?%a1(SIifc{`1W~&OXlZbGv^}On{EDeOQMnn zKxxiWkBa6X>%T2}T_?R{#9ULo4J(WXo@q6v>{?Q;|F-DW5r#dWn5+o13wu}<(>PNf zf<9O8e2S@d2D)dBScgIwm)V;?Fsav`6vhPNeB+8LKvmrEOi|8v=CqMvsqAk?mo6*A z!n^ozughJ|R2C)|U0|6H76bZ$Pwtv0rUEY{~>lYbNA3HG2GQEMG z%Mt8NWGNqn@!a)cK{fydD(RX1dJ9vAv6@ECkKEGiCC8u_CrRra#TV?cZXj710MIHA z%sNp9QP8m`naDjyq;$t|2s@!+miJVn%%_!(3&B`vgZKd72#yAh9BMxLN;z?8A8^VE z{BWkcre_weB9=x;kDxyZKa9k-=5S)Db8uKuW@?%7h3@9-X_v;XFa}#0s zhl;G|M8xfj8V%X7bvsTojr3${Sy@zVO6TBsJw6W731Ua0ao3xWZreBcUL5gq^qZMw0(2z;Npiqd9X> z6jRU&|I>KPZ|n#qraVmDq8n#cJ(Ha)xl2QNWx(-s1$i2$7{BsjgzM)}8Grv*qz339 zC20W&8wr62V_Q#}d=du|`U*lcRF(rl!>cBy2Mh1-;|zw1G-lXlc0Vw1+0v=i6YwR8 z#}P<=U!yU|N`z5+rIgX0btrtIY_2GOh|?)LZ&ZXWm#MX^TLjmmlJJGRb`*htH42aj z`GS#E3_*C_6x*_hUL)QV zn=?VoWYy@0hV&YCH^1cht+e@;=Wcd)^-tP+D1vp(>>OSPO`C`Dvu*!qIlP-PMh+Cx z!{=)_K8%%a#Mv6WpOruL>H58O7QI&R{l7hVhQ_Uj*2}J$Q1(wcsyi=6>75Tf?ndZEH%hWzy=v z9W1yR{n;rl)o4>?EaXpIkd|sDj`Vg(9Cft}`*l{YK)=&)>eVs}lmV2YSZZo4AtU*(``XaYO%2CMr=0_h-YNPYPHH z9Ty;U0{d)lQKLP=0(b!VbCg;3Rv(XBgWyh2y z#r?avKdby}KETJnjuzfFC!gX(S8knsc8Z-%$sO0W|7twVtj5qi4~o_x+;GG@{5iaj z76-KZaejB?9=uf$zc5y=pmXcVPuXQ#N2LDn?L=J1jtNpG1Y+5%%cXOb{5)qV=bV>oXy*sA)HT{L zD-HGyn)zQPiaWneOn;PBZmJswInc3%^nZzbgZYm)Zvn0aDI0UZCBOK+IS@cq^4%Op zV;FrCw<|@VhE08PmaS)Kxkr!ngJhTxH~#wz6-A~FGRp`uixNs;j>HP4;#MrNS2#gv z0k9KAfD(rwGK_UR4Z@v6JWoVI0gzeDtXC}Tn<=|e@~8i&yNDDm z-s6a*wje=zV?_6@kd~^^%BuZq-z(aKGo9V_uiVF0z*lQd%J@C7&2Kb1X>4mm;sXro z1BO7lRO#>iZ}M@FgI8}0?td0BV}-v4S^q|(!9fqlbELB0mWtmCo*YnO>qM6jhyZY~ zRTK_8zEDd;3(!C`qNMW`9R<$)MPmL3`wd?tMCc?Hic}coq&jVW;MfQ}eJ7)(*A2B% zLeB})!u^SCOB-n=!tMv07*dZ?^_ge7B+ zFH9@lZzDZ@h_iaAeoUYJz~K2n&mK>wgA~9=80yAh@j*B zr7R#!d05E6e7-GRkX%)xBif^5gc~mCi6ry|PuLTQM`iMLxdzHIH2IRDSgF*!Rhxk% z$5~@Xj~2y+{6i&iGcE-(xhqHh(j--4dICSeu1sPiF9+ZB^HvE0M5n)MBOdQ zT3gvS$xbKp*zS)>Hi3?-gbhF)oiU@kxNR@UPhmNn;*5)+hCeX+ZjVRXDAWl>AY$tv zj{Mip6VySwDa&A&PCT&|JHgL7LUB66XWQ}_0Z0fPorS3Jll`6G;d3Hq2nm; zON-xI;rgsH+}PR!hYWV9%mMnjN@=!w4g>~%D_V?^flqWXq>j?ndd59^CNrr)I}pRf z)OUrcw75vP{c^bEdL#4R3j|8G_T>b{R$bCk_?b(8LT3S zGB-;fIs3<6Hi%hq{HzLHE*GUg_XjhqL}I;|!`a@j5>uwK$!qkBf25~|Jk)Kal<>{F zkLMP7j$QnY6*3i(xZ#!Bj#XxFs-4ahHLA}4mUoGOn-?v*BTINzFFx$EMh;ZY`A889&K3Ycx9as(tlZ< zt-bnRd-9ZS=Ngw6GOm}6Kdw1kZzefV7JvL;{9k+W*LzPKpYStC%Ce~;^y zo-+TzI04jp;58QlQ9S|`7l^4Igy?a^QI9Ceg``-Iq{)SBQ2$FL0@=PE#hnWk=39@t zi~4VM4K;xaExjHs-@|~93%!mDqpco;?B;z>J?0$Ot0@ogE*I8GJ=QhX>*xB{|G2PG z8?aw<;}A9AP;uijHQ;h`;|Vt4Npj;WHsEV=6BslQm~+Duc|K{PW@#!u8K!0#PCi+| zW?4x-ImKorrKo15|1Tu+u>aGEJg0!QV5_yHfQ@3S zji!LDL94B~fSrA-ox6a&Z>xQffJ0QPLxO-~daGl;fKyqkQ=NcwTdQ-QfXi5`%bbAg zTC3}>fZIu{+qHoEbF2G50T0wRkJo~pL~Wi_f?iB*UYvs7f^FWCg6|dE-fIf_7_|AA z3x2R~``|9<>)YlVB=|9^?PG$VUwWHgzMy|un}40)r?$3FeS!gFZ2@zFpV!(x?+ON< zv;|%Z20gb0{SypEZ4Z7e6hhP$y6eidnCMguI*dDGa6k*UFVJ;MjZ2!>? z2??P2i3Cvo*F4kw!%%j$w6|5aw0E?2er0dz>S`&@#lgqV$IlP2{ZABajx3BA_4M+~ z;&V*QkjlyVm1SV8Yh+SXW>H;d|KaJy<@H_9=v4C8Dxa8io8b7QuT?!GQ-1N8ox>A$ zA@S=w`%{Z+4q?!S?!mi5i1e>{)y;>emk*CG1=YIG(P{qB?8$`{zl5xSq}=JHwa4e5 z$LE(T8$0JeZazV??;oF+zHK-43{5VqCgfK`v|D(x!c=-=6|Ka67y!?lk|M2o3UjD<&e|Y&1FaP1?KfL^hm;dnc zA71{$%YS(J4=?}Ww?DM2R>?c3rre$iR<%r|zV{53 z=J7=%r{`>Bbmw9Eluq`Wn@rL5?Nnj>XuUd+v@S?2euDUi6w* z^0`TFxJg1XoO{fR=b%YCs!{TP%Kv6|syneYUh$JA0jdW%RX*AO%KtE4X=`3#GG0a0 z_p(HHvi5w+>3mG?d?LPloUfb2PIzRDo0Z3!)#mur*P7LL`7}Y zU3$yAe14;{7Na_TFrOggp-&$k~oEv1v`=@ zg;NweQZ$8A4LVZIh12Xi(%gm9eLK>FgfpT#G7^L{(>pTrg|o^!vg(Ah+d8uQgmcC^ za^{3{*E(`{h4W52@~(yRpF8sZ2^XMt7Q7ZIB#v(#Or%(t^FNTfWfvphkhBE7RBU!=0Ev$9U4s;#rCPo(<9N9sS+0FE0Z zOw2Fu9-O3>)Fc*Gb`4KnT;HaZ)U@`G9Gsln1jXGwJ_jV`IEF#pqmskY3i7I&My3}l zn!7f3_xBD@D_gp2JNnkQzprlX*0lG{t!(s;O}7ncKMrYWODo9*z(3sNNRrX==9yg^V-(l+{(B85G)3c8^Cb`IBtL> zj1eLwx7QEE1|uQDaRWGRum;BsNZ_~u95;aD25{T}jvK&n12}E~#|_}P0US4g;|6ft z0FE2LaRWGRAd8g1Dk$g=#|_}P0US4g;|6ft0FE2LaRWGR0LKmBxB(nDAg$~GSG@s0 zV*)j|GdB;)_w;kswDTi88VFJvaNGcn8^Cb`IBo#P4dA!|95;aD25{T}jvK&n12}E~ z#|_}P0US4g;|6ft0FE2LaRWGR0LKmBxB(nDfa3;m+yIUnz;OeiP^R`!PN6Wt_Ap7I zaK-j;O`!;b_6T#KNH}g_>FR1J&c(sU&&SUXu>DW|ZH_FA81?k>%i?oP%#g~-`ITj0 ztZQUaRAy0KXaC{p#pU%~&*)V0*D9ZwberJ#q_0&yBU66ynVrKEb|LZWJNr|MYYt)1 zhVH?;ho||~jfnKGdDYE_rD6~Bb6fTY~%rM1WBpU3ByD;qoKKW;uj zv+p0Dm%eQ`^$bletS01FJUsn8y}Y&xik+BWDX3{VI=d`sXkXdfwGV~k2FHO(xlZAU z(b=U%^=&PEBPSO>s@r-yhbDFpj?XTylZ&gGdxsa-x6(>$zho6hW_(RAt&Pnoi_9z< zn_G^{D+^A^t8VR`T3Efkf2wWo>l>fRD61QtS#0bcjLt4eEv_!EZ~Om15ct3Fpt8cU#-jV4!aES^Ya)~Pg^Xe^mZ z=dzy6QEn=o$rkcH-`ZnrNO5ra~#z5e?U1dr8h zy1n6G3`(b(r`FMUG?l^YyffX=bTU^U8$+qy*?hKCu2W?;)7f&dR&PC(r{2|iwb|}{ zu`|;J#|>D{ic|ER&Pp=uD$h!DKAfMG6-2U}mlvlwomZ5XR-RW@x1OI@!Rkj@F5tKU z95;aD1{}QKG=h70Swg#|@jT(U0US3#gyRNKIBo#P4dA!|95;aD25{T}jvK&n12}E~ z#|_}P0US4g;|6ft0FE0d{Tn*%2r+@<25{T}jvK&n12}E~#|_}P0US4g;|6ft0FE0B zGsYB@3@a5$^=O9mGYro&v>^qXp$D7ePLs34aRWGR0LKmBxB(nDfa3;m+yIUnz;OdO zZUDy(;J5)CH-O^?aNGcn8^Cb`IBo#P4dA!|95;aD25{T}jvK&n12}E~#|;30<|h(B z`Cm;=^AAJW)zaQp-O}FC+WD3J|2}R2z~gTCa{d1=#@%!o_p7A7pZC@*tl3&aY|>qC zzaf{_2#mPkojz^ij*0JWy_a=qg9U#)xw_dwc)AiC3Pxmp*+VCS?S6;QRksJl3cB4K z{FUbr9!R;j|9J$m@7+DlLA>k;EQtDXeX5UEe-9wxTl6EK(m;bj7+m#Ih*;FY(97n{ z_^uy_;?#UdwyAC+edPuvopU%!TJuQw4{8HQDAJtbk03NEzFQlTpzhuYot6NA0I(Q9 zM%;@d$5@t_y&jX4oPB(~EImu974zI1Rd=Iq8*qd-j_QR13JIt7 zN5CEcqws)m_F_T(pQvZ)m83CHfH35rRI{LrGz8pvGn5o`5UNaQPO20&7KM4It1O3Y$Zv33ja=$9t1Jllket7s)c=OxNue5P#Z&m4-zJH2U&oH z=|D0x?M<}A1JqJ`<+Eb`*eqsCY~NBGI)C`#$57JPD^V+f)u7=7To%a6T7$UQJWE+S zd}X5SZwQ$tv{U`7%1@Om-UcPNl!`o7XvJ0PmWlAy(fCv}6;|rEO|I1X`&8+dFzXi< zEu)yOh}lw9xh-}UG^It=IQ6_T!8_Eyo93@=?zmVVW@)SY^;j4Ds@kH&ZlaSTzRs7d z+KOmueKfG89`Xpa964B@GLBPw}LkhFew$~irxdA*ja!OjM zwE$Qs>R0NBH(G`0`t!L@!K30KH?<$yrc9-ICPdZ-G~W2nXnB>iZ1sM?b1W;l z)_y$M4;Q%sW}?_^CI^#sIJYxQOzv!CK-f@tcAEH2U!Z46D;P=!4<9ivpzh$n~m0h zV_34`6mv3|_YH)mkKIfu?w@LJcm|EVy~B74Drg2^^QPu6W=!!++b7(=j8NkCf_?fH z!^R(kH6hW!49r8D_+mRIwJFcPOypoQ9;&@ETD`|}oS0(S5gt*%1aQNq?V1EO4BZ$h zaz4?X@E^v$@;!b>hS_+ecI~nR@{Pd7n1eg7SsH7__Lfv z=cOS#JHO|c8$$Y3clALEw?l~(gA^EMET;Js$1BNUyXxBWSYPm&%F$VF*1i3qFz#ws z{NN|`S1f>B<+F=!nD)x@_F+>^&zfOE%*KW(A&y*&1f;g4~9>}-)siaSJa@5rCq zrPJ7iD?xLKsc}$b`MFmRRXBz-9$OUurQfPQF zq}*jo-faz}`aL1_36Df=-8!cRJhBA|&#Z0T+Y|gP#**AwYV&!rhUxvicljr@J*W9% z%OBWf)+cc^2K(8S8aP=SBykn=@@!5JbTi#2^qBDTuW@S7^<|LIUsNiD3>L(8ihoSx z$mM>h*VDM;4IC{9098M4p_QP8!MF}&zA z39-B(reMt=V;7?29)H7oO3n!(<97%W1hWW_lZ!f#iJt~Zp1zSTCzs7IP&^GJD`%I_ zAXjE4Q+Ei~EPwMB9GK}7VVDsi*W{s-@kY;q+=w{RiaFAxJ^b5U#EW30Q+s5pUS#$N zivxtg6a2=zo!-Zg!FQe64?_Qmnc;IebC4l@$P0bgN9G7-dRWvr{TC(Xm>0UZ4Eh9O z=EQNjWC!}xQ>OF`x=bPZ>~^MH2fBPPeIbOYNQkavovzG~sRB$_RZdsK%v85d+i)6b zvK*ny6I0+2lO7t=SQ=wG7~=|xWu}egk%@J(ie(6mB|nZy{TfTRAKN${n*xfXk%?oq zin9)lOJayK`Wk1sA4d*~XQYiclZl@kiF;=iZ}K&sXfS>S5}&vqPe7YMC6i!al^~0f z@LZmd5SoCqpFjqJ>d->5WT3=WP_0ntf?Z_(SE$B5^!-S}N9II-rNjV-#6U=5aCu_r zcw+czVk9^T!kiSXloacb6c0&)mM0~RC#9SwrGa6|8O+I9O3676$$60Ej&Z15d9oiU z(K3Qn$}vhpnNId+g1jG-;x_^1FVX51(V7#{Z_lE2&|>sR;>5naQT0oFN0MNm9CO{6 z`eh|Gn>LMGIqmODs_4(iDyuZi{WLjHdQ?Q3S$UcpZTh5QdPZov^kDj8S$da4`T%pr zkW$8oL&g{+W1>7`3Y;;wpYDE~F*BZF56Vnp%v@5+w6n_GFUw>b%;fx%2?1qkjHO|o zX0Ac9zLjTfGG`^pWa*w|MS`-a8M7y3vhVD(9V@cOLbGqivLYt3n;CQ1m2+bDvz^hR z`jvgBelm=|@tNt!7!`J1@QYu{WS(lliVm2mzpTl!5tVsr|!NIGgK zH9D)@NOqy#LX7+LABvNA}1CF6*Y5Ru~37?ILB1ycM*ar3uP6(rDNp%MIp{Y7+O>$BT_6sRK$Mn!0(?as8X!9Q7md*tc;%e zw(|4cW08<$Nn%Kewou6mija{Jp7}YkWi*9#CxNto@p^bEc6lkfcBzqPsY!Hz%Q>0b zd5HHUu}9X|zK>;BgmiuzWxL~L>_la-)02`=bV8pj;x8-(;aS4KD%3g?p#JG8PQ*b@*jXZ#GLsd5zE#YBsi;(`tVYi-t;{KB2~Pi2?oY}P!$Q$! zL{Mmi-O-8LlSS0$6qav9+@*p&5RE(LL^Of^c}RtLLx~0-)Y>cdHfjFoW}JnD&!PZIN}(kf-ywo zWX&4fO&Al6S0c4cn~h|*#=UeV15HL=3dlnDz|JV|mb^*Ly$D358T+=0;G)G9p;eT- zSuGpqsD<~W#AwsnbC(fYmkiLKa#`_d5iK$^vut){X?2lq6|ro!@RUS=O5%@7=6rC` zF>Xol^*>s2La3MUn`(RYy^TP+gUhl*5TV`7)0&(fTl7h~U-lEJ0k)@Tn_G-`QI%A< zU1`!3b_Od>-6n2>Dqhwm0d1MA6^cs?22j$~Re=H65dscRbv0esO~0|ns&FUB@LHw_ z5DipAp1VA%+JBF>Bf=6LVpa+K$r9~ViOPmR6beeXz8AaN02L zMsMh@#prX~=pn9b9-WMv7*(1o?RsCud-j|6;(~YfiD0v<>Dr;sA+<^MH^G4@_R&RO znQG^<=m0p;Eyt$+A*RnsTCPkFDewk0n9IM`7Mtt_C4?G`B!wWz1vUVX3d!DHvZQ{; zsM&hyj%ZZ{6?(rF!0s{b=~R@cMN&n3?nVDY6n8oxC5w7uJcuL>j$7u1Fbz%n4Kq#- z{F;nwn^K#l@9g?LL>Pe09K}0^-=W{#z+5pLAb=S0-_xo$Sjq(35UPX`3>M%5frC*w zwUFKC+sI7BU_qB-{5d1`m^iZb8uF-`_*|bvW81~Wdb}>W64KuzaE%-rjeklUetWF` z1~s+`r`>fd7}6!-ZgmFgYe{i$1YCd{CxhY08^o0;C2AuAl+U7ZlR zpKxP!0W|{MU$RE3PFBz!}~>D*X}R*+p8+ft#xp0Ftak6unyYc^g^)#wvPo8`Mf_8H8>3$ z%^X|TM?BtYTRfkArI3O=?jxG;(0_OLO_-}VtKnqK6FaCA#ue~NT1=#JZ{Mkx0@3ppk)?#v2r7>eJ0oxC)}<t-`H@UmvCX1S;TOZl2<{3=Y)%H+&dBHz;(XoIXpN}{@txpHj zRLhbZ5pAGCkYzJ3KUNV#@9wLZ!<(8zk(&Jiar5dAKI-%qF6;w(SOAj3D7e%D^Vk9x z69`pp|BVMc4)u~eefaW#CQy%1V1a_6b*LP_r3GbisCG zw>Gl3#$N6aIhLmW?_NX*Xw#!f5Xlr$Y$;0J|p4;p{g>z6_XI`!9 z@5mlROC*2~{hIwuai`}WyHT-^zu{DCcf^K<8aAeeachKeC&Tw%e$oC%QR!G-Vh(>b z>625Hiw>6y6l2GY$Sa|H=LWWGgd6AY3Qi%%C$HJCaa@kA_^^wqkwxf`OM+2SZtCYG z)Yv8VHf^ugZLj$Q543X*)_M=t4sN94Yd*xMN_#KD{*D6$&O$>l=O>Np&v~Alf!CBZ zN{7cMzm2iu9+Z~#`VqMiH0OB@pw=usH*+KQgw#iRaz}3?cm9^#`4U>7B_5%)9$~Cn zERb8i@LF1%9al$MCKxwg<~14zO;BAQdNSU9i{#B1y-<8@sYmI?D}I`5qfkt*_`b>w zSsJml-$wL)QHuLa`DvU!l9zGyEI)ol4AmNe`gD*(CnC=}Kl@Zd;nHjEHvgTTg{C8| zxx0|JyIoLwFUK7c!sYMy2OxOpjkyQ2z%V!po52IU9Lifk{Z%4CGokwoVb3Pmd@fWH z`z!1xO}Z=+jvZs0d*u%Pc`wcoXIJ_x9`4v#Ce@=}-ftJ!oNc!xHiNI%TYWW~=^Z3) z#7YmjTFwjWPa*AQ_APxs3nZ}f{{0Ci*Ja=x_G*5(pnWn%p({4iu)1}32``rp8wbdLgS}c zOQ`gH0f!bD({HlB|Fc~Gn*(MB3;6Z;9Tlhu4Aed`U=u2xr55{|?9>UM27qJ4%Co^m zvr?c?&`C5GsK1tyG?a!GfW~#Az?w9v|H{xe$l)CDF7!u=_!pHO>tmb^#6$1PD}cTE zTB*wFK^4}!U=`^|d}UHkCAtJTo?_Z$n?_|OMQ!(qrG(K=8fj$sUuWtdfh@ej~v{G2%5(%ZD2egI=aLvBRyhhP}0U(rW zDR;_>-}sXfeZr&|on#Ty?DEDH}Gl}PO~hN#~R_rIrqoBekjGjbNJrxT)PaT*@)WicLN z=L+QtCd2x~vu-&jZ!lrCWZSmg@?m7o)GwLOcgOs~HbFsz7~Oh_Ah+eIR9qU@8Z*p@ znofs;8=c04l8~ajAZ$a9gEoxxJ+ApD!8ASVcu6}VGpJ(ToORNasqgqO65TZQ(4PpL zVteG{hoW)Ds>{Y{0dMc`b22cpn&u^oz;gaD3t8cvrzdp?q`K5x8B|RO-`1Y zVQp3M*J8hKxI}4})c96xcs+%VikCFR2%;J^!(g$-XMK|HoF4OvW2)|pnu^NrmqTST4}mNW{tBI;3Mdx>j^vfw+|8O|8ROHGWs z{$%~UMLhPaFfpDp=YZm>X>|SeHa>8f4)=;!>E3Y;8YO2#OVFXDAh4L25N<=y@I_Q+ zupvnabjV=}>p;l+V~k zvKJZ=o+SuO&N-2@7g?DQ_pV*ay$-h*d-YM>Z*?i}dARKNMy6)q(^CGwVN!7f5v@?d zs@Hx8))#FNGGiAL_ z?KA=I67~p3HCz9I^x5T7!I6p=r!1Ykr{%K7%`?pi5#6t5?B(+EPTHyGwM85&6`Bz& z)zqYVmHI1{pL5RjS~~S=_ZzCrk(~{1pVb=DR;umg9rPDE^;=tg5}bUTO^!qiFq2Yi zeMg+l22f!JJx?ojK@7O&2%?6Ai=LTL@-9{c*ir&C!)NiRXt#lS;HeO%-P~KcpVdvUqymP0~M*i2; zJtEs^OS`^(NWNAj;iCVDajk>el>=1t+vMEpeJ7~f&8OvJ{_?!8YZJLnx=*$5Hgc^S z##Sd0_Q~w2mcQrXll!Nm-?JBkGJehutE(U_B*{Mr*hMkd0m!klzjg%s+KYxBRz)pP z%pZFUfM_JFtyB{HL2OLn;SI8dMU*zJ&Hmrf{E0WClkc*DVxwUEAZ>ca`7NQK+XBa*R}%Ga!% z&4REnapX|N#2vL%=NF42`F+h@Y3W&Ci{#gSJ8L9&Haqd?Y#H6Id6#>ka^Jo-mUdR# zQ08JIXdE`(`@K3>-1U>pZ@<-20kbzFI0-MKpYG;d_!YTjxC0b{6;MVU9TPl0=T@6Qvc9^m4ZQp z{lUn5{RlkIMgWRbFo?KdJo8b|BU$5?-AK#^%lAuQ$RdAGuE`<2pzye8C~_97Ev@Nm z=nMi^NHanN2oEfxMN4g2!I9gqW#6gs9VQ!lJpl@PgW2K41|^A=vO`dvBz*XR!_gke z^Z$5@u7pKLEue(LSC8<@BbdfvY}w#_7=kcp`OI@}bIZ^0IV%JfVopamG0prJ8cJe= ziH4XlhqTBQ2I;>Bk%WLTWe^JJP7q6+x=!R@|8nRO&no8R2JEy@Y`LAU8|*Q2rD@s2 zv{Wq@uEDLCU)f`G3XJDz5oA@c{{#i*y#$jR7%H6M+$XS|K0NrI%i_L>YZ zA^>zAG4s<43i#Ikb2Z-~K_ z;NYqoNHsXPW?gg!4+A7uhb-0)(HU5Bl1|LPKjH!(L!=@zq&O2L&olaeykPyg2UGrm z+<=2`%Lf3i*G&G>Y%2W(CSU213LmX;i2Qn&rv?r$U|_O=#8<--u{ToKmtY)vX$(wU zdOis+BN@i6DjpX`=3$5mH$*ja@a3R?1rPEIBlve%@1M;+*pPJkTLOJchyhI>zOF1E z8xvCwyIhJyuWA}#Nci%*OE^a|wxAcN?-hFhUts`0K7rl1!R~$%9+|NN7&P($LOOiI za;$PzRbDA8GsZq)g^cXBRI+r9J($Zjlds+2E?9`e>Wb{4Uo}| zrDnFt?3NW5-WqgxfMnyO=L}%ZcyvbrufnijEpojI6H0i)m$lXoDVA2SwJG9lF11-E z-74%9u?BM^07h~-Nbj&uxJLaki9;YzG}sru7w>E!INO>{%2!wMz)IoRNGZ80iFG0= zfh^mVO$I?(cuYB&-!WMtXVkPfN2DWJ%#uvv7Oz-!ES#L~!vjGoTWhl1M5(jVS@eXI z)kNSYWzI@vlL=)py5a0_|>@{y4yQ!RDHaa zJ0JMF{!lijQ1#l3w=GXOBTn10s-=regYKpVT)vF3$q$$?jgb>h*i194s11gzl}t@d zz8{$8tDeHAope#0jip(zp_(rig)Qf(EMl^+&{Hn4(a*67uG!3tEl($e&Xg9;Y!s(& z=gneQp5J!jjY7&7#>se~vM|VE;zduJ}wRp4UH7d38yXW&=8ZbXAWAV46>TzJ3&NKee z?6}kV$+m#=cMAV6Hx7RVo}MDHxI7^R8;QC+*(-G-_BZ76vXm6!6s~;KdJ8)@3q8ee z`&kwd)fN}=wY$l+OT@IFonYEqIg3m!F$}IV%#W;W$l@GV)30i@SxYcD`8C*m8o3CT z@OYNyWR_xSb)rA%)FUnNtLtPV)d}S;h`0)g5U`4g(@K68l=?g?yrNUH`7G7b8^}4LYJ9ASD8Iu^DmV)yUtsR6%_^zLS8*H z=N0i+db+kudRNN&C3^3+i;a)U4Ah6!M^+ZPbxd8E%_#V-a&?U#SIi^WEJv8EDRgbw zB~;W`+r3s*t5&<@^c~_>Epk^0uk>BzrLQ_ykx322Sq+B%=(ma(2pF%qUe$lt=J}XP zWA|6kAK4%gx<=c$76zL%V7ypc+cLOCU;m_@_r9evNL)WuUMS48CPZF0N^e~tY1J^! z@GyLRrgL4d#xTa#uu{hG;pe)`k$&{HVZr43X24o<&l>c|Fp2%$n&rFAFW=r>t*7hF zWkpnG${S?YP~?uVaF@#x!E+l_Ue4Z9vA z+Xy4Q_undxHWE{f>Q-8+3Ce0r4I5tZ*Qvm~K*Rp-gS> z{Mufx-r6?J+GF4Orp|QG!hXa+a;!&psIGIuKyxb2bf(9C(V{cYuro(saLzA#{aO1` zy=v3d@NV0Tf@e1m*SrX{OJln0=eLXQWKIybtDwG{le>#kv)kFdTee|7^=sE+a@P&r zVvNNC`O>^hWN*;O!k%>JK6eMHw*qA+AAwN|-Aoz7%oHus;`IAo=HTA#l|?z4<@O(o zVwUf`;+DTmEWfH)_V|ClUD*4Y^Zg;#k|$sfN1$}aww|n)m5Nesu;%*@^8IVJ{Ts3U zTebZ=ll^-am?ec78nwVgSHwPgpjBFu6;ka!Z>JU5)#~|=m3GlAH>34Q{XUPv0XO9? zpWVSxK#f48^^w?tQ0al6@qx&w^@mRfV#fzQ*#{CRHf~)9Qj9he8wXGx_S;8w`5#vA zWNjX7Y;a($vLCdSOSM()<`gLP)%A5*18vl1`7~wg)apYJo>eX-BH1M`pc8TC=u-uk60-9NV?l z>I&HH``Zbd+L@Lfo4PGqVjWo>A9to4N2A+6b{(5N+S;HT8@3)hNZ6SK+S_T^L1~bM zFaR7_FmVVJDY865=mD($FSSZe9$2>zJGIA+JoF;m^K4!A{!#Yp zJ#rui>8HR5`9fK&g;zCrkk}8WaRQL|G;a6Y0)0(Ek#b4PlN zFrak$$?P-|D>y38EIN<*i=A!K0tA2nLk-BcH$p)iSwCKo$kqWZt}tY&j#w^82_dAE zar|}?zLnOmGVxylR#m7#-jS~uRQ5b&`M{@xvaryBoR z5pHHNJ1gG3$dUcXATEeWyZ8hO@K%WU@CkA(06B^OafWsA{+O7QTih@JY}VWpHQuw0 z*tv=kyoQH1{X>3605V>B;Tm{6T+YRd0q_mEV+?UcBLUy+oc_D);o}UFd1NRao=AX8 z1#yJ;A25=E$Ii^LpD^LEx7^8+oCZGl`nOz2`LHS`+7%Y?0}D8lF#BppbXeX9wDS-u zasyG&dh*Z`g49saJj#0kEIPUD;R4?JUDk@I&%gST;s zVFi1LLjS;|T*#PhP4VOJ3)bI@U*9Es891uPx&+JI8v0x-eGz>fEN1Yaqv)gMd`mR; zNL(hRDf|AZ=fMvlB;b7<&>o&h{{>eFS=R!h+Yhl6gjh*_m_>2l&XeT)?HvMsz<$8N z2oB?x{n#{al(T`yA{@}28;nA4E2xr)^lNam|=pUdUAf!HETJy}QEj@KWG@Yc| z4KvsspVV_0>|BgFHLj57_=zsyQyBH{L$_a+(tnKTqXRMj46ON;?*5AV4l)aZy!D7P zo&SS?mLmNoMOGOf@-C3|0(>F}KK&9j!wj5L%e4>1i@v}u7=!L0x_h5 zUR%t7bug8`71uX!YD+MlvObq#qTB>-xK=Pyhcto)iNt3aU@!Eo>cCq`${*(r56s$O z*vUMuq&P)O<=RAn0fy3+D}VvXhkn@UfCXFZ2bBH(oBENj6;5j`GviO}TkT#ai#4J? z72DnZ&vy|REu0oW5F#Fj%gc>aH{=M*%ti1*KO9Q-;qyys!CaIS8al%{asB?>SH)xw zalz)Zi(mf`u-%e zNVU!^r}Oc0L*07!$6p_>>+gNZ`P-&HU+&KJ^3AVdJsVFqC->_4+Y*2O6l|xB)%^=H zyF(D74w=6-pbq`;lW98?O=LYKc#!{vIzmC-kS221G=nAzU44BkiX!^-dkCqU5N-5Q zN&CJ(Q{%WLWNhSRAHwlNfG!S3v5`TSu$4M)q>sQQ1t_ZvS!zM4k#EAKUNir+0k8om zy^9iD~9HJOSb8ODT&Rfjks&(W-H6e+ z!xbG|$$eGp?!UNyxWE6!=ka;Go{zV+i4Q*K0ma2SYFxg#UOhaeAW(HHrgSW1Q(1mM zA~Z5&KO`cnRM*H;J@uwK(!>4FeTG34mw%^m3_pdp# z=)Orl=PhX;wkv+xIY|nMbQTEKdcGrwIQo&PTp=vEqr6=*PptGaK7)~#KXXnT300|_ zV@2hKTk!_6*kL?J>|LJK z&LaOHz24Zb;_lEhpsCSnJ5G#9&WzF7?zg#SO_~XIrp@T0U5!~e!v3iblh|DaB=hhMnJonk)8I*QY^ z(_cC_lBYGU4Rqg&DsBwzUEHRtj<|IMnjhH@OY(q(DPrJ_5et;C%L|o2Cd5OPI_^R0 zsxQr&v(hxM<-q2OI*_YNp3iDtp%k<#ED2$C*^no-Qw!3}KdoM9>rluT6P@D@2V=<% z-zwhdVNU4On;Uc#_dXSGFUh$ZwW4C%w?XUhahG6=$0~}=hVOlmpRG(){x*WhngdTl z6&8no;0E1-yvk{IFHLL*Vej3z73+G&kXxqqB2*vdZ(6p6xWA4&`D0~!zUh&gdE4P&i*}zwcJBvV%NqfL1gq2&P~Csj&V^|24@NRa@`V z!S;~aggC&W$2+oWs5INI4X^6q6KsC8&eW@fsM_!I&GO6n%(A%+cf;;Q&>l6|Sg&z3 ziyz$b>5rO|ODVS6lz^=~1L5y0jG{gMu$V^t-Su@P`;luN@KUN9f9BkA*XX$w{xhw4 zAs8UHpQy;xdMEzpV2Dxe*_vEZLd7dJ?_hQN-32y1m2O2Sa=wqZZ`}B4XkCi$UP)+g z$pjuKQ>DJH*oB2TWWnI?cHDcrt9mxDV+u91DkWyzB-Os%J8H!5!0=e=HCs!UTq_FJ zDYTe0A&R*_m#FvXuj2HjcI5|rBw4tlAmwW-OniuZ#l-(HOmP7@WtG}_+!QrBP;$Dc zW9t^}{CF6$9`jYaM%CkX!R!9|@Qcu=^sdXU%WDNxx`=LW6p84-} z&r~*lI2?GPafEg3#)oqqx$ceASI)B9l<9LF`(Bw&LI2=iUw_xkjJF(kd-kzFEqpIz z&qETdbm^Sy@2KKL|LIGg3(K7QO9b}cqIjdVwVUvZ8_PwJVnfGVSgbUSaIoSnEfhJ? zJB#Q(aAo1Wyg$2J6g~J|cfi^BYO}g{)i)PiIcH5z)osm0f{%i*{q~Say`R|^YJYFX zlWtN}x7qqEsGXu;BQoWt*_{YoWDG`=@+4o^HNWx%drV_-uz!`;h^^J$`dYZ*%&DTM zF>{o#!7#IuBD)Q`tJ7A>Eb?}gTz!65-*oww+`6YhHA>gmDjexxbLX6D{%zsAl_=M~ z)h%K_QSh!?X{A*Q)t@Tf2}xd)EakB3P?DQ2@*)DW%~r(@Zm(9ROMXC3ICkOB+BxWO z)x8@x-nF(wRoI%+M-oYC4Iiy&kgoq&(iwj=Sx}PgpE<=IXI)GrEX=x>20kkM*>h1N z=q+6P+F-)o^^V|v@sR#G=qqyRqHr)P155B2xU)?Z;!MTiW z=IkESukGjEP;*kDR>XYp)-eid;U0sa5c!uVO~|nRWAAN87oy`|KOQi@(`6BKF#X=; z*SjNR(^H2M%5jCyKK97!$I3p_H5AW}u$NBV%e|VWk)sH?95B$yG*9@(_*);YKj?eZ zA-6%zof7tv%B)uu+-H{AGwlyKf#Yf3Vc3 zV>;{WUO3iCniPNh{&#!}dMZH4qwkEQPIb0=vliPg#_Q^pU!aQE-qDoTiLn;FMTh#2SYJw4U zM+NNtT6LgRy=O>6U!kd-rNWgn@Ql`f6I-Pd#Pz=sZTG|cT_VV#cubqTq|oah_+n47;d=#rEZ3$ z;i)zwn;~OL>Dse1YnW6M)=MKBr0L?2smk!Wj2RQ=%=)+)vuA8$d2Ga|*z(tH|4h96 z1&LeIi-Z0f`^yq_&N%Kfd^T2VdaCs;^gM(+H2rLfa zD9VV>nPf7lIu2&Ce3q6i)i;{uDcTL0pocfFl0j>*&IUwcoZ9qrz6jkgz=*Cyl9wh zA-rwT7-|xaO2=%^;BC*t>|pSAFfraNo;MrgBjEW+F}^aMZy&}_&ifr|?VRN8oW{`R zd9+20|1!^Ci3x!50}$9iLw=w+HVEJc*`$ z<|s@f;nJzXbQ6Mu#!I>W}F6^PDC@uf0RX&=5!E-D+vpPLk&o5nNe zMa)Hf`Ld{7iLZc(D-eWALvf`!p$ZUJ*$}E7#nmK24OLu2Bb*NrpN}T6lEf@Jp*BNY zn@6Z)i0hbydX~7JO=u8^8>ECrnYgi!&?FZ(jS`wC#m&^VbqY?Qb5`HvMkR%b%iNXwtFpnr=NJLDcm?aUji4uWC zA|+msNiOse+vSq>QDVoWq+^;WotH=#iJi-m33WA4`hhd9@85DOsQ>3PuAuY-r5`B$ zK8UP79#` literal 0 HcmV?d00001 diff --git a/vendor/github.com/gabriel-vasile/mimetype/mimetype.go b/vendor/github.com/gabriel-vasile/mimetype/mimetype.go new file mode 100644 index 00000000..1b5909b7 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/mimetype.go @@ -0,0 +1,124 @@ +// Package mimetype uses magic number signatures to detect the MIME type of a file. +// +// File formats are stored in a hierarchy with application/octet-stream at its root. +// For example, the hierarchy for HTML format is application/octet-stream -> +// text/plain -> text/html. +package mimetype + +import ( + "io" + "io/ioutil" + "mime" + "os" + "sync/atomic" +) + +// readLimit is the maximum number of bytes from the input used when detecting. +var readLimit uint32 = 3072 + +// Detect returns the MIME type found from the provided byte slice. +// +// The result is always a valid MIME type, with application/octet-stream +// returned when identification failed. +func Detect(in []byte) *MIME { + // Using atomic because readLimit can be written at the same time in other goroutine. + l := atomic.LoadUint32(&readLimit) + if l > 0 && len(in) > int(l) { + in = in[:l] + } + mu.RLock() + defer mu.RUnlock() + return root.match(in, l) +} + +// DetectReader returns the MIME type of the provided reader. +// +// The result is always a valid MIME type, with application/octet-stream +// returned when identification failed with or without an error. +// Any error returned is related to the reading from the input reader. +// +// 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) +func DetectReader(r io.Reader) (*MIME, error) { + var in []byte + var err error + + // Using atomic because readLimit can be written at the same time in other goroutine. + l := atomic.LoadUint32(&readLimit) + if l == 0 { + in, err = ioutil.ReadAll(r) + if err != nil { + return errMIME, err + } + } else { + var n int + in = make([]byte, l) + // io.UnexpectedEOF means len(r) < len(in). It is not an error in this case, + // it just means the input file is smaller than the allocated bytes slice. + n, err = io.ReadFull(r, in) + if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { + return errMIME, err + } + in = in[:n] + } + + mu.RLock() + defer mu.RUnlock() + return root.match(in, l), nil +} + +// DetectFile returns the MIME type of the provided file. +// +// The result is always a valid MIME type, with application/octet-stream +// returned when identification failed with or without an error. +// Any error returned is related to the opening and reading from the input file. +func DetectFile(path string) (*MIME, error) { + f, err := os.Open(path) + if err != nil { + return errMIME, err + } + defer f.Close() + + return DetectReader(f) +} + +// EqualsAny reports whether s MIME type is equal to any MIME type in mimes. +// MIME type equality test is done on the "type/subtype" section, ignores +// any optional MIME parameters, ignores any leading and trailing whitespace, +// and is case insensitive. +func EqualsAny(s string, mimes ...string) bool { + s, _, _ = mime.ParseMediaType(s) + for _, m := range mimes { + m, _, _ = mime.ParseMediaType(m) + if s == m { + return true + } + } + + return false +} + +// SetLimit sets the maximum number of bytes read from input when detecting the MIME type. +// Increasing the limit provides better detection for file formats which store +// their magical numbers towards the end of the file: docx, pptx, xlsx, etc. +// A limit of 0 means the whole input file will be used. +func SetLimit(limit uint32) { + // Using atomic because readLimit can be read at the same time in other goroutine. + atomic.StoreUint32(&readLimit, limit) +} + +// Extend adds detection for other file formats. +// It is equivalent to calling Extend() on the root mime type "application/octet-stream". +func Extend(detector func(raw []byte, limit uint32) bool, mime, extension string, aliases ...string) { + root.Extend(detector, mime, extension, aliases...) +} + +// Lookup finds a MIME object by its string representation. +// The representation can be the main mime type, or any of its aliases. +func Lookup(mime string) *MIME { + mu.RLock() + defer mu.RUnlock() + return root.lookup(mime) +} diff --git a/vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md b/vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md new file mode 100644 index 00000000..5ec6f6b6 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md @@ -0,0 +1,178 @@ +## 173 Supported MIME types +This file is automatically generated when running tests. Do not edit manually. + +Extension | MIME type | Aliases +--------- | --------- | ------- +**n/a** | application/octet-stream | - +**.xpm** | image/x-xpixmap | - +**.7z** | application/x-7z-compressed | - +**.zip** | application/zip | application/x-zip, application/x-zip-compressed +**.xlsx** | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | - +**.docx** | application/vnd.openxmlformats-officedocument.wordprocessingml.document | - +**.pptx** | application/vnd.openxmlformats-officedocument.presentationml.presentation | - +**.epub** | application/epub+zip | - +**.jar** | application/jar | - +**.odt** | application/vnd.oasis.opendocument.text | application/x-vnd.oasis.opendocument.text +**.ott** | application/vnd.oasis.opendocument.text-template | application/x-vnd.oasis.opendocument.text-template +**.ods** | application/vnd.oasis.opendocument.spreadsheet | application/x-vnd.oasis.opendocument.spreadsheet +**.ots** | application/vnd.oasis.opendocument.spreadsheet-template | application/x-vnd.oasis.opendocument.spreadsheet-template +**.odp** | application/vnd.oasis.opendocument.presentation | application/x-vnd.oasis.opendocument.presentation +**.otp** | application/vnd.oasis.opendocument.presentation-template | application/x-vnd.oasis.opendocument.presentation-template +**.odg** | application/vnd.oasis.opendocument.graphics | application/x-vnd.oasis.opendocument.graphics +**.otg** | application/vnd.oasis.opendocument.graphics-template | application/x-vnd.oasis.opendocument.graphics-template +**.odf** | application/vnd.oasis.opendocument.formula | application/x-vnd.oasis.opendocument.formula +**.odc** | application/vnd.oasis.opendocument.chart | application/x-vnd.oasis.opendocument.chart +**.sxc** | application/vnd.sun.xml.calc | - +**.pdf** | application/pdf | application/x-pdf +**.fdf** | application/vnd.fdf | - +**n/a** | application/x-ole-storage | - +**.msi** | application/x-ms-installer | application/x-windows-installer, application/x-msi +**.aaf** | application/octet-stream | - +**.msg** | application/vnd.ms-outlook | - +**.xls** | application/vnd.ms-excel | application/msexcel +**.pub** | application/vnd.ms-publisher | - +**.ppt** | application/vnd.ms-powerpoint | application/mspowerpoint +**.doc** | application/msword | application/vnd.ms-word +**.ps** | application/postscript | - +**.psd** | image/vnd.adobe.photoshop | image/x-psd, application/photoshop +**.p7s** | application/pkcs7-signature | - +**.ogg** | application/ogg | application/x-ogg +**.oga** | audio/ogg | - +**.ogv** | video/ogg | - +**.png** | image/png | - +**.png** | image/vnd.mozilla.apng | - +**.jpg** | image/jpeg | - +**.jxl** | image/jxl | - +**.jp2** | image/jp2 | - +**.jpf** | image/jpx | - +**.jpm** | image/jpm | video/jpm +**.jxs** | image/jxs | - +**.gif** | image/gif | - +**.webp** | image/webp | - +**.exe** | application/vnd.microsoft.portable-executable | - +**n/a** | application/x-elf | - +**n/a** | application/x-object | - +**n/a** | application/x-executable | - +**.so** | application/x-sharedlib | - +**n/a** | application/x-coredump | - +**.a** | application/x-archive | application/x-unix-archive +**.deb** | application/vnd.debian.binary-package | - +**.tar** | application/x-tar | - +**.xar** | application/x-xar | - +**.bz2** | application/x-bzip2 | - +**.fits** | application/fits | - +**.tiff** | image/tiff | - +**.bmp** | image/bmp | image/x-bmp, image/x-ms-bmp +**.ico** | image/x-icon | - +**.mp3** | audio/mpeg | audio/x-mpeg, audio/mp3 +**.flac** | audio/flac | - +**.midi** | audio/midi | audio/mid, audio/sp-midi, audio/x-mid, audio/x-midi +**.ape** | audio/ape | - +**.mpc** | audio/musepack | - +**.amr** | audio/amr | audio/amr-nb +**.wav** | audio/wav | audio/x-wav, audio/vnd.wave, audio/wave +**.aiff** | audio/aiff | audio/x-aiff +**.au** | audio/basic | - +**.mpeg** | video/mpeg | - +**.mov** | video/quicktime | - +**.mqv** | video/quicktime | - +**.mp4** | video/mp4 | - +**.webm** | video/webm | audio/webm +**.3gp** | video/3gpp | video/3gp, audio/3gpp +**.3g2** | video/3gpp2 | video/3g2, audio/3gpp2 +**.avi** | video/x-msvideo | video/avi, video/msvideo +**.flv** | video/x-flv | - +**.mkv** | video/x-matroska | - +**.asf** | video/x-ms-asf | video/asf, video/x-ms-wmv +**.aac** | audio/aac | - +**.voc** | audio/x-unknown | - +**.mp4** | audio/mp4 | audio/x-m4a, audio/x-mp4a +**.m4a** | audio/x-m4a | - +**.m3u** | application/vnd.apple.mpegurl | audio/mpegurl +**.m4v** | video/x-m4v | - +**.rmvb** | application/vnd.rn-realmedia-vbr | - +**.gz** | application/gzip | application/x-gzip, application/x-gunzip, application/gzipped, application/gzip-compressed, application/x-gzip-compressed, gzip/document +**.class** | application/x-java-applet | - +**.swf** | application/x-shockwave-flash | - +**.crx** | application/x-chrome-extension | - +**.ttf** | font/ttf | font/sfnt, application/x-font-ttf, application/font-sfnt +**.woff** | font/woff | - +**.woff2** | font/woff2 | - +**.otf** | font/otf | - +**.ttc** | font/collection | - +**.eot** | application/vnd.ms-fontobject | - +**.wasm** | application/wasm | - +**.shx** | application/vnd.shx | - +**.shp** | application/vnd.shp | - +**.dbf** | application/x-dbf | - +**.dcm** | application/dicom | - +**.rar** | application/x-rar-compressed | application/x-rar +**.djvu** | image/vnd.djvu | - +**.mobi** | application/x-mobipocket-ebook | - +**.lit** | application/x-ms-reader | - +**.bpg** | image/bpg | - +**.sqlite** | application/vnd.sqlite3 | application/x-sqlite3 +**.dwg** | image/vnd.dwg | image/x-dwg, application/acad, application/x-acad, application/autocad_dwg, application/dwg, application/x-dwg, application/x-autocad, drawing/dwg +**.nes** | application/vnd.nintendo.snes.rom | - +**.lnk** | application/x-ms-shortcut | - +**.macho** | application/x-mach-binary | - +**.qcp** | audio/qcelp | - +**.icns** | image/x-icns | - +**.heic** | image/heic | - +**.heic** | image/heic-sequence | - +**.heif** | image/heif | - +**.heif** | image/heif-sequence | - +**.hdr** | image/vnd.radiance | - +**.mrc** | application/marc | - +**.mdb** | application/x-msaccess | - +**.accdb** | application/x-msaccess | - +**.zst** | application/zstd | - +**.cab** | application/vnd.ms-cab-compressed | - +**.rpm** | application/x-rpm | - +**.xz** | application/x-xz | - +**.lz** | application/lzip | application/x-lzip +**.torrent** | application/x-bittorrent | - +**.cpio** | application/x-cpio | - +**n/a** | application/tzif | - +**.xcf** | image/x-xcf | - +**.pat** | image/x-gimp-pat | - +**.gbr** | image/x-gimp-gbr | - +**.glb** | model/gltf-binary | - +**.avif** | image/avif | - +**.cab** | application/x-installshield | - +**.jxr** | image/jxr | image/vnd.ms-photo +**.txt** | text/plain | - +**.html** | text/html | - +**.svg** | image/svg+xml | - +**.xml** | text/xml | - +**.rss** | application/rss+xml | text/rss +**.atom** | application/atom+xml | - +**.x3d** | model/x3d+xml | - +**.kml** | application/vnd.google-earth.kml+xml | - +**.xlf** | application/x-xliff+xml | - +**.dae** | model/vnd.collada+xml | - +**.gml** | application/gml+xml | - +**.gpx** | application/gpx+xml | - +**.tcx** | application/vnd.garmin.tcx+xml | - +**.amf** | application/x-amf | - +**.3mf** | application/vnd.ms-package.3dmanufacturing-3dmodel+xml | - +**.xfdf** | application/vnd.adobe.xfdf | - +**.owl** | application/owl+xml | - +**.php** | text/x-php | - +**.js** | application/javascript | application/x-javascript, text/javascript +**.lua** | text/x-lua | - +**.pl** | text/x-perl | - +**.py** | text/x-python | text/x-script.python, application/x-python +**.json** | application/json | - +**.geojson** | application/geo+json | - +**.har** | application/json | - +**.ndjson** | application/x-ndjson | - +**.rtf** | text/rtf | - +**.srt** | application/x-subrip | application/x-srt, text/x-srt +**.tcl** | text/x-tcl | application/x-tcl +**.csv** | text/csv | - +**.tsv** | text/tab-separated-values | - +**.vcf** | text/vcard | - +**.ics** | text/calendar | - +**.warc** | application/warc | - +**.vtt** | text/vtt | - diff --git a/vendor/github.com/gabriel-vasile/mimetype/tree.go b/vendor/github.com/gabriel-vasile/mimetype/tree.go new file mode 100644 index 00000000..253bd006 --- /dev/null +++ b/vendor/github.com/gabriel-vasile/mimetype/tree.go @@ -0,0 +1,260 @@ +package mimetype + +import ( + "sync" + + "github.com/gabriel-vasile/mimetype/internal/magic" +) + +// mimetype stores the list of MIME types in a tree structure with +// "application/octet-stream" at the root of the hierarchy. The hierarchy +// approach minimizes the number of checks that need to be done on the input +// and allows for more precise results once the base type of file has been +// identified. +// +// root is a detector which passes for any slice of bytes. +// When a detector passes the check, the children detectors +// are tried in order to find a more accurate MIME type. +var root = newMIME("application/octet-stream", "", + func([]byte, uint32) bool { return true }, + xpm, sevenZ, zip, pdf, fdf, ole, ps, psd, p7s, ogg, png, jpg, jxl, jp2, jpx, + jpm, jxs, gif, webp, exe, elf, ar, tar, xar, bz2, fits, tiff, bmp, ico, mp3, flac, + midi, ape, musePack, amr, wav, aiff, au, mpeg, quickTime, mqv, mp4, webM, + threeGP, threeG2, avi, flv, mkv, asf, aac, voc, aMp4, m4a, m3u, m4v, rmvb, + gzip, class, swf, crx, ttf, woff, woff2, otf, ttc, eot, wasm, shx, dbf, dcm, rar, + djvu, mobi, lit, bpg, sqlite3, dwg, nes, lnk, macho, qcp, icns, heic, + heicSeq, heif, heifSeq, hdr, mrc, mdb, accdb, zstd, cab, rpm, xz, lzip, + torrent, cpio, tzif, xcf, pat, gbr, glb, avif, cabIS, jxr, + // Keep text last because it is the slowest check + text, +) + +// errMIME is returned from Detect functions when err is not nil. +// Detect could return root for erroneous cases, but it needs to lock mu in order to do so. +// errMIME is same as root but it does not require locking. +var errMIME = newMIME("application/octet-stream", "", func([]byte, uint32) bool { return false }) + +// mu guards access to the root MIME tree. Access to root must be synchronized with this lock. +var mu = &sync.RWMutex{} + +// The list of nodes appended to the root node. +var ( + xz = newMIME("application/x-xz", ".xz", magic.Xz) + gzip = newMIME("application/gzip", ".gz", magic.Gzip).alias( + "application/x-gzip", "application/x-gunzip", "application/gzipped", + "application/gzip-compressed", "application/x-gzip-compressed", + "gzip/document") + sevenZ = newMIME("application/x-7z-compressed", ".7z", magic.SevenZ) + zip = newMIME("application/zip", ".zip", magic.Zip, xlsx, docx, pptx, epub, jar, odt, ods, odp, odg, odf, odc, sxc). + alias("application/x-zip", "application/x-zip-compressed") + tar = newMIME("application/x-tar", ".tar", magic.Tar) + xar = newMIME("application/x-xar", ".xar", magic.Xar) + bz2 = newMIME("application/x-bzip2", ".bz2", magic.Bz2) + pdf = newMIME("application/pdf", ".pdf", magic.Pdf). + alias("application/x-pdf") + fdf = newMIME("application/vnd.fdf", ".fdf", magic.Fdf) + xlsx = newMIME("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsx", magic.Xlsx) + docx = newMIME("application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".docx", magic.Docx) + pptx = newMIME("application/vnd.openxmlformats-officedocument.presentationml.presentation", ".pptx", magic.Pptx) + epub = newMIME("application/epub+zip", ".epub", magic.Epub) + jar = newMIME("application/jar", ".jar", magic.Jar) + ole = newMIME("application/x-ole-storage", "", magic.Ole, msi, aaf, msg, xls, pub, ppt, doc) + msi = newMIME("application/x-ms-installer", ".msi", magic.Msi). + alias("application/x-windows-installer", "application/x-msi") + aaf = newMIME("application/octet-stream", ".aaf", magic.Aaf) + doc = newMIME("application/msword", ".doc", magic.Doc). + alias("application/vnd.ms-word") + ppt = newMIME("application/vnd.ms-powerpoint", ".ppt", magic.Ppt). + alias("application/mspowerpoint") + pub = newMIME("application/vnd.ms-publisher", ".pub", magic.Pub) + xls = newMIME("application/vnd.ms-excel", ".xls", magic.Xls). + alias("application/msexcel") + msg = newMIME("application/vnd.ms-outlook", ".msg", magic.Msg) + ps = newMIME("application/postscript", ".ps", magic.Ps) + fits = newMIME("application/fits", ".fits", magic.Fits) + ogg = newMIME("application/ogg", ".ogg", magic.Ogg, oggAudio, oggVideo). + alias("application/x-ogg") + oggAudio = newMIME("audio/ogg", ".oga", magic.OggAudio) + oggVideo = newMIME("video/ogg", ".ogv", magic.OggVideo) + text = newMIME("text/plain", ".txt", magic.Text, html, svg, xml, php, js, lua, perl, python, json, ndJSON, rtf, srt, tcl, csv, tsv, vCard, iCalendar, warc, vtt) + xml = newMIME("text/xml", ".xml", magic.XML, rss, atom, x3d, kml, xliff, collada, gml, gpx, tcx, amf, threemf, xfdf, owl2) + json = newMIME("application/json", ".json", magic.JSON, geoJSON, har) + har = newMIME("application/json", ".har", magic.HAR) + csv = newMIME("text/csv", ".csv", magic.Csv) + tsv = newMIME("text/tab-separated-values", ".tsv", magic.Tsv) + geoJSON = newMIME("application/geo+json", ".geojson", magic.GeoJSON) + ndJSON = newMIME("application/x-ndjson", ".ndjson", magic.NdJSON) + html = newMIME("text/html", ".html", magic.HTML) + php = newMIME("text/x-php", ".php", magic.Php) + rtf = newMIME("text/rtf", ".rtf", magic.Rtf) + js = newMIME("application/javascript", ".js", magic.Js). + alias("application/x-javascript", "text/javascript") + srt = newMIME("application/x-subrip", ".srt", magic.Srt). + alias("application/x-srt", "text/x-srt") + vtt = newMIME("text/vtt", ".vtt", magic.Vtt) + lua = newMIME("text/x-lua", ".lua", magic.Lua) + perl = newMIME("text/x-perl", ".pl", magic.Perl) + python = newMIME("text/x-python", ".py", magic.Python). + alias("text/x-script.python", "application/x-python") + tcl = newMIME("text/x-tcl", ".tcl", magic.Tcl). + alias("application/x-tcl") + vCard = newMIME("text/vcard", ".vcf", magic.VCard) + iCalendar = newMIME("text/calendar", ".ics", magic.ICalendar) + svg = newMIME("image/svg+xml", ".svg", magic.Svg) + rss = newMIME("application/rss+xml", ".rss", magic.Rss). + alias("text/rss") + owl2 = newMIME("application/owl+xml", ".owl", magic.Owl2) + atom = newMIME("application/atom+xml", ".atom", magic.Atom) + x3d = newMIME("model/x3d+xml", ".x3d", magic.X3d) + kml = newMIME("application/vnd.google-earth.kml+xml", ".kml", magic.Kml) + xliff = newMIME("application/x-xliff+xml", ".xlf", magic.Xliff) + collada = newMIME("model/vnd.collada+xml", ".dae", magic.Collada) + gml = newMIME("application/gml+xml", ".gml", magic.Gml) + gpx = newMIME("application/gpx+xml", ".gpx", magic.Gpx) + tcx = newMIME("application/vnd.garmin.tcx+xml", ".tcx", magic.Tcx) + amf = newMIME("application/x-amf", ".amf", magic.Amf) + threemf = newMIME("application/vnd.ms-package.3dmanufacturing-3dmodel+xml", ".3mf", magic.Threemf) + png = newMIME("image/png", ".png", magic.Png, apng) + apng = newMIME("image/vnd.mozilla.apng", ".png", magic.Apng) + jpg = newMIME("image/jpeg", ".jpg", magic.Jpg) + jxl = newMIME("image/jxl", ".jxl", magic.Jxl) + jp2 = newMIME("image/jp2", ".jp2", magic.Jp2) + jpx = newMIME("image/jpx", ".jpf", magic.Jpx) + jpm = newMIME("image/jpm", ".jpm", magic.Jpm). + alias("video/jpm") + jxs = newMIME("image/jxs", ".jxs", magic.Jxs) + xpm = newMIME("image/x-xpixmap", ".xpm", magic.Xpm) + bpg = newMIME("image/bpg", ".bpg", magic.Bpg) + gif = newMIME("image/gif", ".gif", magic.Gif) + webp = newMIME("image/webp", ".webp", magic.Webp) + tiff = newMIME("image/tiff", ".tiff", magic.Tiff) + bmp = newMIME("image/bmp", ".bmp", magic.Bmp). + alias("image/x-bmp", "image/x-ms-bmp") + ico = newMIME("image/x-icon", ".ico", magic.Ico) + icns = newMIME("image/x-icns", ".icns", magic.Icns) + psd = newMIME("image/vnd.adobe.photoshop", ".psd", magic.Psd). + alias("image/x-psd", "application/photoshop") + heic = newMIME("image/heic", ".heic", magic.Heic) + heicSeq = newMIME("image/heic-sequence", ".heic", magic.HeicSequence) + heif = newMIME("image/heif", ".heif", magic.Heif) + heifSeq = newMIME("image/heif-sequence", ".heif", magic.HeifSequence) + hdr = newMIME("image/vnd.radiance", ".hdr", magic.Hdr) + avif = newMIME("image/avif", ".avif", magic.AVIF) + mp3 = newMIME("audio/mpeg", ".mp3", magic.Mp3). + alias("audio/x-mpeg", "audio/mp3") + flac = newMIME("audio/flac", ".flac", magic.Flac) + midi = newMIME("audio/midi", ".midi", magic.Midi). + alias("audio/mid", "audio/sp-midi", "audio/x-mid", "audio/x-midi") + ape = newMIME("audio/ape", ".ape", magic.Ape) + musePack = newMIME("audio/musepack", ".mpc", magic.MusePack) + wav = newMIME("audio/wav", ".wav", magic.Wav). + alias("audio/x-wav", "audio/vnd.wave", "audio/wave") + aiff = newMIME("audio/aiff", ".aiff", magic.Aiff).alias("audio/x-aiff") + au = newMIME("audio/basic", ".au", magic.Au) + amr = newMIME("audio/amr", ".amr", magic.Amr). + alias("audio/amr-nb") + aac = newMIME("audio/aac", ".aac", magic.AAC) + voc = newMIME("audio/x-unknown", ".voc", magic.Voc) + aMp4 = newMIME("audio/mp4", ".mp4", magic.AMp4). + alias("audio/x-m4a", "audio/x-mp4a") + m4a = newMIME("audio/x-m4a", ".m4a", magic.M4a) + m3u = newMIME("application/vnd.apple.mpegurl", ".m3u", magic.M3u). + alias("audio/mpegurl") + m4v = newMIME("video/x-m4v", ".m4v", magic.M4v) + mp4 = newMIME("video/mp4", ".mp4", magic.Mp4) + webM = newMIME("video/webm", ".webm", magic.WebM). + alias("audio/webm") + mpeg = newMIME("video/mpeg", ".mpeg", magic.Mpeg) + quickTime = newMIME("video/quicktime", ".mov", magic.QuickTime) + mqv = newMIME("video/quicktime", ".mqv", magic.Mqv) + threeGP = newMIME("video/3gpp", ".3gp", magic.ThreeGP). + alias("video/3gp", "audio/3gpp") + threeG2 = newMIME("video/3gpp2", ".3g2", magic.ThreeG2). + alias("video/3g2", "audio/3gpp2") + avi = newMIME("video/x-msvideo", ".avi", magic.Avi). + alias("video/avi", "video/msvideo") + flv = newMIME("video/x-flv", ".flv", magic.Flv) + mkv = newMIME("video/x-matroska", ".mkv", magic.Mkv) + asf = newMIME("video/x-ms-asf", ".asf", magic.Asf). + alias("video/asf", "video/x-ms-wmv") + rmvb = newMIME("application/vnd.rn-realmedia-vbr", ".rmvb", magic.Rmvb) + class = newMIME("application/x-java-applet", ".class", magic.Class) + swf = newMIME("application/x-shockwave-flash", ".swf", magic.SWF) + crx = newMIME("application/x-chrome-extension", ".crx", magic.CRX) + ttf = newMIME("font/ttf", ".ttf", magic.Ttf). + alias("font/sfnt", "application/x-font-ttf", "application/font-sfnt") + woff = newMIME("font/woff", ".woff", magic.Woff) + woff2 = newMIME("font/woff2", ".woff2", magic.Woff2) + otf = newMIME("font/otf", ".otf", magic.Otf) + ttc = newMIME("font/collection", ".ttc", magic.Ttc) + eot = newMIME("application/vnd.ms-fontobject", ".eot", magic.Eot) + wasm = newMIME("application/wasm", ".wasm", magic.Wasm) + shp = newMIME("application/vnd.shp", ".shp", magic.Shp) + shx = newMIME("application/vnd.shx", ".shx", magic.Shx, shp) + dbf = newMIME("application/x-dbf", ".dbf", magic.Dbf) + exe = newMIME("application/vnd.microsoft.portable-executable", ".exe", magic.Exe) + elf = newMIME("application/x-elf", "", magic.Elf, elfObj, elfExe, elfLib, elfDump) + elfObj = newMIME("application/x-object", "", magic.ElfObj) + elfExe = newMIME("application/x-executable", "", magic.ElfExe) + elfLib = newMIME("application/x-sharedlib", ".so", magic.ElfLib) + elfDump = newMIME("application/x-coredump", "", magic.ElfDump) + ar = newMIME("application/x-archive", ".a", magic.Ar, deb). + alias("application/x-unix-archive") + deb = newMIME("application/vnd.debian.binary-package", ".deb", magic.Deb) + rpm = newMIME("application/x-rpm", ".rpm", magic.RPM) + dcm = newMIME("application/dicom", ".dcm", magic.Dcm) + odt = newMIME("application/vnd.oasis.opendocument.text", ".odt", magic.Odt, ott). + alias("application/x-vnd.oasis.opendocument.text") + ott = newMIME("application/vnd.oasis.opendocument.text-template", ".ott", magic.Ott). + alias("application/x-vnd.oasis.opendocument.text-template") + ods = newMIME("application/vnd.oasis.opendocument.spreadsheet", ".ods", magic.Ods, ots). + alias("application/x-vnd.oasis.opendocument.spreadsheet") + ots = newMIME("application/vnd.oasis.opendocument.spreadsheet-template", ".ots", magic.Ots). + alias("application/x-vnd.oasis.opendocument.spreadsheet-template") + odp = newMIME("application/vnd.oasis.opendocument.presentation", ".odp", magic.Odp, otp). + alias("application/x-vnd.oasis.opendocument.presentation") + otp = newMIME("application/vnd.oasis.opendocument.presentation-template", ".otp", magic.Otp). + alias("application/x-vnd.oasis.opendocument.presentation-template") + odg = newMIME("application/vnd.oasis.opendocument.graphics", ".odg", magic.Odg, otg). + alias("application/x-vnd.oasis.opendocument.graphics") + otg = newMIME("application/vnd.oasis.opendocument.graphics-template", ".otg", magic.Otg). + alias("application/x-vnd.oasis.opendocument.graphics-template") + odf = newMIME("application/vnd.oasis.opendocument.formula", ".odf", magic.Odf). + alias("application/x-vnd.oasis.opendocument.formula") + odc = newMIME("application/vnd.oasis.opendocument.chart", ".odc", magic.Odc). + alias("application/x-vnd.oasis.opendocument.chart") + sxc = newMIME("application/vnd.sun.xml.calc", ".sxc", magic.Sxc) + rar = newMIME("application/x-rar-compressed", ".rar", magic.RAR). + alias("application/x-rar") + djvu = newMIME("image/vnd.djvu", ".djvu", magic.DjVu) + mobi = newMIME("application/x-mobipocket-ebook", ".mobi", magic.Mobi) + lit = newMIME("application/x-ms-reader", ".lit", magic.Lit) + sqlite3 = newMIME("application/vnd.sqlite3", ".sqlite", magic.Sqlite). + alias("application/x-sqlite3") + dwg = newMIME("image/vnd.dwg", ".dwg", magic.Dwg). + alias("image/x-dwg", "application/acad", "application/x-acad", + "application/autocad_dwg", "application/dwg", "application/x-dwg", + "application/x-autocad", "drawing/dwg") + warc = newMIME("application/warc", ".warc", magic.Warc) + nes = newMIME("application/vnd.nintendo.snes.rom", ".nes", magic.Nes) + lnk = newMIME("application/x-ms-shortcut", ".lnk", magic.Lnk) + macho = newMIME("application/x-mach-binary", ".macho", magic.MachO) + qcp = newMIME("audio/qcelp", ".qcp", magic.Qcp) + mrc = newMIME("application/marc", ".mrc", magic.Marc) + mdb = newMIME("application/x-msaccess", ".mdb", magic.MsAccessMdb) + accdb = newMIME("application/x-msaccess", ".accdb", magic.MsAccessAce) + zstd = newMIME("application/zstd", ".zst", magic.Zstd) + cab = newMIME("application/vnd.ms-cab-compressed", ".cab", magic.Cab) + cabIS = newMIME("application/x-installshield", ".cab", magic.InstallShieldCab) + lzip = newMIME("application/lzip", ".lz", magic.Lzip).alias("application/x-lzip") + torrent = newMIME("application/x-bittorrent", ".torrent", magic.Torrent) + cpio = newMIME("application/x-cpio", ".cpio", magic.Cpio) + tzif = newMIME("application/tzif", "", magic.TzIf) + p7s = newMIME("application/pkcs7-signature", ".p7s", magic.P7s) + xcf = newMIME("image/x-xcf", ".xcf", magic.Xcf) + pat = newMIME("image/x-gimp-pat", ".pat", magic.Pat) + gbr = newMIME("image/x-gimp-gbr", ".gbr", magic.Gbr) + xfdf = newMIME("application/vnd.adobe.xfdf", ".xfdf", magic.Xfdf) + glb = newMIME("model/gltf-binary", ".glb", magic.Glb) + jxr = newMIME("image/jxr", ".jxr", magic.Jxr).alias("image/vnd.ms-photo") +) diff --git a/vendor/github.com/go-ole/go-ole/com.go b/vendor/github.com/go-ole/go-ole/com.go index dca260e1..cabbac01 100644 --- a/vendor/github.com/go-ole/go-ole/com.go +++ b/vendor/github.com/go-ole/go-ole/com.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/com_func.go b/vendor/github.com/go-ole/go-ole/com_func.go index 7b9fa67f..cef539d9 100644 --- a/vendor/github.com/go-ole/go-ole/com_func.go +++ b/vendor/github.com/go-ole/go-ole/com_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/error_func.go b/vendor/github.com/go-ole/go-ole/error_func.go index 6478b339..8a2ffaa2 100644 --- a/vendor/github.com/go-ole/go-ole/error_func.go +++ b/vendor/github.com/go-ole/go-ole/error_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/error_windows.go b/vendor/github.com/go-ole/go-ole/error_windows.go index 8da277c0..d0e8e685 100644 --- a/vendor/github.com/go-ole/go-ole/error_windows.go +++ b/vendor/github.com/go-ole/go-ole/error_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/guid.go b/vendor/github.com/go-ole/go-ole/guid.go index 27f9557b..8d20f68f 100644 --- a/vendor/github.com/go-ole/go-ole/guid.go +++ b/vendor/github.com/go-ole/go-ole/guid.go @@ -108,9 +108,9 @@ type GUID struct { // // The supplied string may be in any of these formats: // -// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX +// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} // // The conversion of the supplied string is not case-sensitive. func NewGUID(guid string) *GUID { @@ -216,11 +216,11 @@ func decodeHexChar(c byte) (byte, bool) { // String converts the GUID to string form. It will adhere to this pattern: // -// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} +// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} // // If the GUID is nil, the string representation of an empty GUID is returned: // -// {00000000-0000-0000-0000-000000000000} +// {00000000-0000-0000-0000-000000000000} func (guid *GUID) String() string { if guid == nil { return emptyGUID diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go index 999720a0..5414dc3c 100644 --- a/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go +++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go index c7325ad0..32bc1832 100644 --- a/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go +++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go index 26e264d1..5dfa42aa 100644 --- a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go +++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go index 8b090f49..ad30d79e 100644 --- a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go +++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/idispatch_func.go b/vendor/github.com/go-ole/go-ole/idispatch_func.go index 5315505a..b8fbbe31 100644 --- a/vendor/github.com/go-ole/go-ole/idispatch_func.go +++ b/vendor/github.com/go-ole/go-ole/idispatch_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_func.go b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go index f332e439..c1484819 100644 --- a/vendor/github.com/go-ole/go-ole/ienumvariant_func.go +++ b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go index 72e5f31d..4781f3b8 100644 --- a/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go +++ b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_func.go b/vendor/github.com/go-ole/go-ole/iinspectable_func.go index cf0fba0d..348829bf 100644 --- a/vendor/github.com/go-ole/go-ole/iinspectable_func.go +++ b/vendor/github.com/go-ole/go-ole/iinspectable_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_windows.go b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go index 9a686d25..4519a4aa 100644 --- a/vendor/github.com/go-ole/go-ole/iinspectable_windows.go +++ b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go index 90109f55..7e3cb63e 100644 --- a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go +++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go index c758acd9..2ad01639 100644 --- a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go +++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_func.go b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go index 31c0677c..8364a659 100644 --- a/vendor/github.com/go-ole/go-ole/itypeinfo_func.go +++ b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go index 2abab821..54782b3d 100644 --- a/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go +++ b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iunknown_func.go b/vendor/github.com/go-ole/go-ole/iunknown_func.go index 247fccb3..d0a62cfd 100644 --- a/vendor/github.com/go-ole/go-ole/iunknown_func.go +++ b/vendor/github.com/go-ole/go-ole/iunknown_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/iunknown_windows.go b/vendor/github.com/go-ole/go-ole/iunknown_windows.go index faf9c4c7..ede5bb8c 100644 --- a/vendor/github.com/go-ole/go-ole/iunknown_windows.go +++ b/vendor/github.com/go-ole/go-ole/iunknown_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection.go b/vendor/github.com/go-ole/go-ole/oleutil/connection.go index 4c52d55e..60df73cd 100644 --- a/vendor/github.com/go-ole/go-ole/oleutil/connection.go +++ b/vendor/github.com/go-ole/go-ole/oleutil/connection.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package oleutil diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go b/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go index b00ac4a9..8818fb82 100644 --- a/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go +++ b/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package oleutil diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go b/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go index 19fa27e5..ab9c0d8d 100644 --- a/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go +++ b/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package oleutil diff --git a/vendor/github.com/go-ole/go-ole/oleutil/go-get.go b/vendor/github.com/go-ole/go-ole/oleutil/go-get.go index 40bd9ff6..58347628 100644 --- a/vendor/github.com/go-ole/go-ole/oleutil/go-get.go +++ b/vendor/github.com/go-ole/go-ole/oleutil/go-get.go @@ -1,7 +1,6 @@ // This file is here so go get succeeds as without it errors with: // no buildable Go source files in ... // -//go:build !windows // +build !windows package oleutil diff --git a/vendor/github.com/go-ole/go-ole/safearray_func.go b/vendor/github.com/go-ole/go-ole/safearray_func.go index afb1d02d..0dee670c 100644 --- a/vendor/github.com/go-ole/go-ole/safearray_func.go +++ b/vendor/github.com/go-ole/go-ole/safearray_func.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-ole/go-ole/safearray_windows.go b/vendor/github.com/go-ole/go-ole/safearray_windows.go index 0a322f5d..0c1b3a10 100644 --- a/vendor/github.com/go-ole/go-ole/safearray_windows.go +++ b/vendor/github.com/go-ole/go-ole/safearray_windows.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/safearrayconversion.go b/vendor/github.com/go-ole/go-ole/safearrayconversion.go index dde3e17e..da737293 100644 --- a/vendor/github.com/go-ole/go-ole/safearrayconversion.go +++ b/vendor/github.com/go-ole/go-ole/safearrayconversion.go @@ -84,7 +84,7 @@ func (sac *SafeArrayConversion) ToValueArray() (values []interface{}) { safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) values[i] = v case VT_BSTR: - v, _ := safeArrayGetElementString(sac.Array, i) + v , _ := safeArrayGetElementString(sac.Array, i) values[i] = v case VT_VARIANT: var v VARIANT diff --git a/vendor/github.com/go-ole/go-ole/safearrayslices.go b/vendor/github.com/go-ole/go-ole/safearrayslices.go index 063dbbfe..a9fa885f 100644 --- a/vendor/github.com/go-ole/go-ole/safearrayslices.go +++ b/vendor/github.com/go-ole/go-ole/safearrayslices.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/variables.go b/vendor/github.com/go-ole/go-ole/variables.go index 056f844d..a6add1b0 100644 --- a/vendor/github.com/go-ole/go-ole/variables.go +++ b/vendor/github.com/go-ole/go-ole/variables.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/variant_386.go b/vendor/github.com/go-ole/go-ole/variant_386.go index 2e3d3aa4..e73736bf 100644 --- a/vendor/github.com/go-ole/go-ole/variant_386.go +++ b/vendor/github.com/go-ole/go-ole/variant_386.go @@ -1,4 +1,3 @@ -//go:build 386 // +build 386 package ole diff --git a/vendor/github.com/go-ole/go-ole/variant_amd64.go b/vendor/github.com/go-ole/go-ole/variant_amd64.go index b48c3ce6..dccdde13 100644 --- a/vendor/github.com/go-ole/go-ole/variant_amd64.go +++ b/vendor/github.com/go-ole/go-ole/variant_amd64.go @@ -1,4 +1,3 @@ -//go:build amd64 // +build amd64 package ole diff --git a/vendor/github.com/go-ole/go-ole/variant_arm.go b/vendor/github.com/go-ole/go-ole/variant_arm.go index 5c8d492d..d4724544 100644 --- a/vendor/github.com/go-ole/go-ole/variant_arm.go +++ b/vendor/github.com/go-ole/go-ole/variant_arm.go @@ -1,4 +1,3 @@ -//go:build arm // +build arm package ole diff --git a/vendor/github.com/go-ole/go-ole/variant_date_386.go b/vendor/github.com/go-ole/go-ole/variant_date_386.go index 8c3d3085..1b970f63 100644 --- a/vendor/github.com/go-ole/go-ole/variant_date_386.go +++ b/vendor/github.com/go-ole/go-ole/variant_date_386.go @@ -1,4 +1,3 @@ -//go:build windows && 386 // +build windows,386 package ole diff --git a/vendor/github.com/go-ole/go-ole/variant_date_amd64.go b/vendor/github.com/go-ole/go-ole/variant_date_amd64.go index 8554d38d..6952f1f0 100644 --- a/vendor/github.com/go-ole/go-ole/variant_date_amd64.go +++ b/vendor/github.com/go-ole/go-ole/variant_date_amd64.go @@ -1,4 +1,3 @@ -//go:build windows && amd64 // +build windows,amd64 package ole diff --git a/vendor/github.com/go-ole/go-ole/variant_date_arm.go b/vendor/github.com/go-ole/go-ole/variant_date_arm.go index 7afe38b8..09ec7b5c 100644 --- a/vendor/github.com/go-ole/go-ole/variant_date_arm.go +++ b/vendor/github.com/go-ole/go-ole/variant_date_arm.go @@ -1,4 +1,3 @@ -//go:build windows && arm // +build windows,arm package ole diff --git a/vendor/github.com/go-ole/go-ole/variant_ppc64le.go b/vendor/github.com/go-ole/go-ole/variant_ppc64le.go index 4ce060d8..326427a7 100644 --- a/vendor/github.com/go-ole/go-ole/variant_ppc64le.go +++ b/vendor/github.com/go-ole/go-ole/variant_ppc64le.go @@ -1,4 +1,3 @@ -//go:build ppc64le // +build ppc64le package ole diff --git a/vendor/github.com/go-ole/go-ole/variant_s390x.go b/vendor/github.com/go-ole/go-ole/variant_s390x.go index f8373109..9874ca66 100644 --- a/vendor/github.com/go-ole/go-ole/variant_s390x.go +++ b/vendor/github.com/go-ole/go-ole/variant_s390x.go @@ -1,4 +1,3 @@ -//go:build s390x // +build s390x package ole diff --git a/vendor/github.com/go-ole/go-ole/winrt.go b/vendor/github.com/go-ole/go-ole/winrt.go index f503d685..4e9eca73 100644 --- a/vendor/github.com/go-ole/go-ole/winrt.go +++ b/vendor/github.com/go-ole/go-ole/winrt.go @@ -1,4 +1,3 @@ -//go:build windows // +build windows package ole diff --git a/vendor/github.com/go-ole/go-ole/winrt_doc.go b/vendor/github.com/go-ole/go-ole/winrt_doc.go index a392928d..52e6d74c 100644 --- a/vendor/github.com/go-ole/go-ole/winrt_doc.go +++ b/vendor/github.com/go-ole/go-ole/winrt_doc.go @@ -1,4 +1,3 @@ -//go:build !windows // +build !windows package ole diff --git a/vendor/github.com/go-playground/locales/.gitignore b/vendor/github.com/go-playground/locales/.gitignore new file mode 100644 index 00000000..daf913b1 --- /dev/null +++ b/vendor/github.com/go-playground/locales/.gitignore @@ -0,0 +1,24 @@ +# 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 +*.test +*.prof diff --git a/vendor/github.com/go-playground/locales/.travis.yml b/vendor/github.com/go-playground/locales/.travis.yml new file mode 100644 index 00000000..d50237a6 --- /dev/null +++ b/vendor/github.com/go-playground/locales/.travis.yml @@ -0,0 +1,26 @@ +language: go +go: + - 1.13.1 + - tip +matrix: + allow_failures: + - go: tip + +notifications: + email: + recipients: dean.karn@gmail.com + on_success: change + on_failure: always + +before_install: + - go install github.com/mattn/goveralls + +# Only clone the most recent commit. +git: + depth: 1 + +script: + - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./... + +after_success: | + goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file diff --git a/vendor/github.com/go-playground/locales/LICENSE b/vendor/github.com/go-playground/locales/LICENSE new file mode 100644 index 00000000..75854ac4 --- /dev/null +++ b/vendor/github.com/go-playground/locales/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Go Playground + +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. \ No newline at end of file diff --git a/vendor/github.com/go-playground/locales/README.md b/vendor/github.com/go-playground/locales/README.md new file mode 100644 index 00000000..7b6be2c6 --- /dev/null +++ b/vendor/github.com/go-playground/locales/README.md @@ -0,0 +1,170 @@ +## locales +![Project status](https://img.shields.io/badge/version-0.14.1-green.svg) +[![Build Status](https://travis-ci.org/go-playground/locales.svg?branch=master)](https://travis-ci.org/go-playground/locales) +[![GoDoc](https://godoc.org/github.com/go-playground/locales?status.svg)](https://godoc.org/github.com/go-playground/locales) +![License](https://img.shields.io/dub/l/vibe-d.svg) + +Locales is a set of locales generated from the [Unicode CLDR Project](http://cldr.unicode.org/) which can be used independently or within +an i18n package; these were built for use with, but not exclusive to, [Universal Translator](https://github.com/go-playground/universal-translator). + +Features +-------- +- [x] Rules generated from the latest [CLDR](http://cldr.unicode.org/index/downloads) data, v36.0.1 +- [x] Contains Cardinal, Ordinal and Range Plural Rules +- [x] Contains Month, Weekday and Timezone translations built in +- [x] Contains Date & Time formatting functions +- [x] Contains Number, Currency, Accounting and Percent formatting functions +- [x] Supports the "Gregorian" calendar only ( my time isn't unlimited, had to draw the line somewhere ) + +Full Tests +-------------------- +I could sure use your help adding tests for every locale, it is a huge undertaking and I just don't have the free time to do it all at the moment; +any help would be **greatly appreciated!!!!** please see [issue](https://github.com/go-playground/locales/issues/1) for details. + +Installation +----------- + +Use go get + +```shell +go get github.com/go-playground/locales +``` + +NOTES +-------- +You'll notice most return types are []byte, this is because most of the time the results will be concatenated with a larger body +of text and can avoid some allocations if already appending to a byte array, otherwise just cast as string. + +Usage +------- +```go +package main + +import ( + "fmt" + "time" + + "github.com/go-playground/locales/currency" + "github.com/go-playground/locales/en_CA" +) + +func main() { + + loc, _ := time.LoadLocation("America/Toronto") + datetime := time.Date(2016, 02, 03, 9, 0, 1, 0, loc) + + l := en_CA.New() + + // Dates + fmt.Println(l.FmtDateFull(datetime)) + fmt.Println(l.FmtDateLong(datetime)) + fmt.Println(l.FmtDateMedium(datetime)) + fmt.Println(l.FmtDateShort(datetime)) + + // Times + fmt.Println(l.FmtTimeFull(datetime)) + fmt.Println(l.FmtTimeLong(datetime)) + fmt.Println(l.FmtTimeMedium(datetime)) + fmt.Println(l.FmtTimeShort(datetime)) + + // Months Wide + fmt.Println(l.MonthWide(time.January)) + fmt.Println(l.MonthWide(time.February)) + fmt.Println(l.MonthWide(time.March)) + // ... + + // Months Abbreviated + fmt.Println(l.MonthAbbreviated(time.January)) + fmt.Println(l.MonthAbbreviated(time.February)) + fmt.Println(l.MonthAbbreviated(time.March)) + // ... + + // Months Narrow + fmt.Println(l.MonthNarrow(time.January)) + fmt.Println(l.MonthNarrow(time.February)) + fmt.Println(l.MonthNarrow(time.March)) + // ... + + // Weekdays Wide + fmt.Println(l.WeekdayWide(time.Sunday)) + fmt.Println(l.WeekdayWide(time.Monday)) + fmt.Println(l.WeekdayWide(time.Tuesday)) + // ... + + // Weekdays Abbreviated + fmt.Println(l.WeekdayAbbreviated(time.Sunday)) + fmt.Println(l.WeekdayAbbreviated(time.Monday)) + fmt.Println(l.WeekdayAbbreviated(time.Tuesday)) + // ... + + // Weekdays Short + fmt.Println(l.WeekdayShort(time.Sunday)) + fmt.Println(l.WeekdayShort(time.Monday)) + fmt.Println(l.WeekdayShort(time.Tuesday)) + // ... + + // Weekdays Narrow + fmt.Println(l.WeekdayNarrow(time.Sunday)) + fmt.Println(l.WeekdayNarrow(time.Monday)) + fmt.Println(l.WeekdayNarrow(time.Tuesday)) + // ... + + var f64 float64 + + f64 = -10356.4523 + + // Number + fmt.Println(l.FmtNumber(f64, 2)) + + // Currency + fmt.Println(l.FmtCurrency(f64, 2, currency.CAD)) + fmt.Println(l.FmtCurrency(f64, 2, currency.USD)) + + // Accounting + fmt.Println(l.FmtAccounting(f64, 2, currency.CAD)) + fmt.Println(l.FmtAccounting(f64, 2, currency.USD)) + + f64 = 78.12 + + // Percent + fmt.Println(l.FmtPercent(f64, 0)) + + // Plural Rules for locale, so you know what rules you must cover + fmt.Println(l.PluralsCardinal()) + fmt.Println(l.PluralsOrdinal()) + + // Cardinal Plural Rules + fmt.Println(l.CardinalPluralRule(1, 0)) + fmt.Println(l.CardinalPluralRule(1.0, 0)) + fmt.Println(l.CardinalPluralRule(1.0, 1)) + fmt.Println(l.CardinalPluralRule(3, 0)) + + // Ordinal Plural Rules + fmt.Println(l.OrdinalPluralRule(21, 0)) // 21st + fmt.Println(l.OrdinalPluralRule(22, 0)) // 22nd + fmt.Println(l.OrdinalPluralRule(33, 0)) // 33rd + fmt.Println(l.OrdinalPluralRule(34, 0)) // 34th + + // Range Plural Rules + fmt.Println(l.RangePluralRule(1, 0, 1, 0)) // 1-1 + fmt.Println(l.RangePluralRule(1, 0, 2, 0)) // 1-2 + fmt.Println(l.RangePluralRule(5, 0, 8, 0)) // 5-8 +} +``` + +NOTES: +------- +These rules were generated from the [Unicode CLDR Project](http://cldr.unicode.org/), if you encounter any issues +I strongly encourage contributing to the CLDR project to get the locale information corrected and the next time +these locales are regenerated the fix will come with. + +I do however realize that time constraints are often important and so there are two options: + +1. Create your own locale, copy, paste and modify, and ensure it complies with the `Translator` interface. +2. Add an exception in the locale generation code directly and once regenerated, fix will be in place. + +Please to not make fixes inside the locale files, they WILL get overwritten when the locales are regenerated. + +License +------ +Distributed under MIT License, please see license file in code for more details. diff --git a/vendor/github.com/go-playground/locales/currency/currency.go b/vendor/github.com/go-playground/locales/currency/currency.go new file mode 100644 index 00000000..b5a95fb0 --- /dev/null +++ b/vendor/github.com/go-playground/locales/currency/currency.go @@ -0,0 +1,311 @@ +package currency + +// Type is the currency type associated with the locales currency enum +type Type int + +// locale currencies +const ( + ADP Type = iota + AED + AFA + AFN + ALK + ALL + AMD + ANG + AOA + AOK + AON + AOR + ARA + ARL + ARM + ARP + ARS + ATS + AUD + AWG + AZM + AZN + BAD + BAM + BAN + BBD + BDT + BEC + BEF + BEL + BGL + BGM + BGN + BGO + BHD + BIF + BMD + BND + BOB + BOL + BOP + BOV + BRB + BRC + BRE + BRL + BRN + BRR + BRZ + BSD + BTN + BUK + BWP + BYB + BYN + BYR + BZD + CAD + CDF + CHE + CHF + CHW + CLE + CLF + CLP + CNH + CNX + CNY + COP + COU + CRC + CSD + CSK + CUC + CUP + CVE + CYP + CZK + DDM + DEM + DJF + DKK + DOP + DZD + ECS + ECV + EEK + EGP + ERN + ESA + ESB + ESP + ETB + EUR + FIM + FJD + FKP + FRF + GBP + GEK + GEL + GHC + GHS + GIP + GMD + GNF + GNS + GQE + GRD + GTQ + GWE + GWP + GYD + HKD + HNL + HRD + HRK + HTG + HUF + IDR + IEP + ILP + ILR + ILS + INR + IQD + IRR + ISJ + ISK + ITL + JMD + JOD + JPY + KES + KGS + KHR + KMF + KPW + KRH + KRO + KRW + KWD + KYD + KZT + LAK + LBP + LKR + LRD + LSL + LTL + LTT + LUC + LUF + LUL + LVL + LVR + LYD + MAD + MAF + MCF + MDC + MDL + MGA + MGF + MKD + MKN + MLF + MMK + MNT + MOP + MRO + MRU + MTL + MTP + MUR + MVP + MVR + MWK + MXN + MXP + MXV + MYR + MZE + MZM + MZN + NAD + NGN + NIC + NIO + NLG + NOK + NPR + NZD + OMR + PAB + PEI + PEN + PES + PGK + PHP + PKR + PLN + PLZ + PTE + PYG + QAR + RHD + ROL + RON + RSD + RUB + RUR + RWF + SAR + SBD + SCR + SDD + SDG + SDP + SEK + SGD + SHP + SIT + SKK + SLL + SOS + SRD + SRG + SSP + STD + STN + SUR + SVC + SYP + SZL + THB + TJR + TJS + TMM + TMT + TND + TOP + TPE + TRL + TRY + TTD + TWD + TZS + UAH + UAK + UGS + UGX + USD + USN + USS + UYI + UYP + UYU + UYW + UZS + VEB + VEF + VES + VND + VNN + VUV + WST + XAF + XAG + XAU + XBA + XBB + XBC + XBD + XCD + XDR + XEU + XFO + XFU + XOF + XPD + XPF + XPT + XRE + XSU + XTS + XUA + XXX + YDD + YER + YUD + YUM + YUN + YUR + ZAL + ZAR + ZMK + ZMW + ZRN + ZRZ + ZWD + ZWL + ZWR +) diff --git a/vendor/github.com/go-playground/locales/logo.png b/vendor/github.com/go-playground/locales/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9c431fa7630d7c70dae53687dec3bf451ddc2c4e GIT binary patch literal 37356 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/go-playground/locales/rules.go b/vendor/github.com/go-playground/locales/rules.go new file mode 100644 index 00000000..92029001 --- /dev/null +++ b/vendor/github.com/go-playground/locales/rules.go @@ -0,0 +1,293 @@ +package locales + +import ( + "strconv" + "time" + + "github.com/go-playground/locales/currency" +) + +// // ErrBadNumberValue is returned when the number passed for +// // plural rule determination cannot be parsed +// type ErrBadNumberValue struct { +// NumberValue string +// InnerError error +// } + +// // Error returns ErrBadNumberValue error string +// func (e *ErrBadNumberValue) Error() string { +// return fmt.Sprintf("Invalid Number Value '%s' %s", e.NumberValue, e.InnerError) +// } + +// var _ error = new(ErrBadNumberValue) + +// PluralRule denotes the type of plural rules +type PluralRule int + +// PluralRule's +const ( + PluralRuleUnknown PluralRule = iota + PluralRuleZero // zero + PluralRuleOne // one - singular + PluralRuleTwo // two - dual + PluralRuleFew // few - paucal + PluralRuleMany // many - also used for fractions if they have a separate class + PluralRuleOther // other - required—general plural form—also used if the language only has a single form +) + +const ( + pluralsString = "UnknownZeroOneTwoFewManyOther" +) + +// Translator encapsulates an instance of a locale +// NOTE: some values are returned as a []byte just in case the caller +// wishes to add more and can help avoid allocations; otherwise just cast as string +type Translator interface { + + // The following Functions are for overriding, debugging or developing + // with a Translator Locale + + // Locale returns the string value of the translator + Locale() string + + // returns an array of cardinal plural rules associated + // with this translator + PluralsCardinal() []PluralRule + + // returns an array of ordinal plural rules associated + // with this translator + PluralsOrdinal() []PluralRule + + // returns an array of range plural rules associated + // with this translator + PluralsRange() []PluralRule + + // returns the cardinal PluralRule given 'num' and digits/precision of 'v' for locale + CardinalPluralRule(num float64, v uint64) PluralRule + + // returns the ordinal PluralRule given 'num' and digits/precision of 'v' for locale + OrdinalPluralRule(num float64, v uint64) PluralRule + + // returns the ordinal PluralRule given 'num1', 'num2' and digits/precision of 'v1' and 'v2' for locale + RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64) PluralRule + + // returns the locales abbreviated month given the 'month' provided + MonthAbbreviated(month time.Month) string + + // returns the locales abbreviated months + MonthsAbbreviated() []string + + // returns the locales narrow month given the 'month' provided + MonthNarrow(month time.Month) string + + // returns the locales narrow months + MonthsNarrow() []string + + // returns the locales wide month given the 'month' provided + MonthWide(month time.Month) string + + // returns the locales wide months + MonthsWide() []string + + // returns the locales abbreviated weekday given the 'weekday' provided + WeekdayAbbreviated(weekday time.Weekday) string + + // returns the locales abbreviated weekdays + WeekdaysAbbreviated() []string + + // returns the locales narrow weekday given the 'weekday' provided + WeekdayNarrow(weekday time.Weekday) string + + // WeekdaysNarrowreturns the locales narrow weekdays + WeekdaysNarrow() []string + + // returns the locales short weekday given the 'weekday' provided + WeekdayShort(weekday time.Weekday) string + + // returns the locales short weekdays + WeekdaysShort() []string + + // returns the locales wide weekday given the 'weekday' provided + WeekdayWide(weekday time.Weekday) string + + // returns the locales wide weekdays + WeekdaysWide() []string + + // The following Functions are common Formatting functionsfor the Translator's Locale + + // returns 'num' with digits/precision of 'v' for locale and handles both Whole and Real numbers based on 'v' + FmtNumber(num float64, v uint64) string + + // returns 'num' with digits/precision of 'v' for locale and handles both Whole and Real numbers based on 'v' + // NOTE: 'num' passed into FmtPercent is assumed to be in percent already + FmtPercent(num float64, v uint64) string + + // returns the currency representation of 'num' with digits/precision of 'v' for locale + FmtCurrency(num float64, v uint64, currency currency.Type) string + + // returns the currency representation of 'num' with digits/precision of 'v' for locale + // in accounting notation. + FmtAccounting(num float64, v uint64, currency currency.Type) string + + // returns the short date representation of 't' for locale + FmtDateShort(t time.Time) string + + // returns the medium date representation of 't' for locale + FmtDateMedium(t time.Time) string + + // returns the long date representation of 't' for locale + FmtDateLong(t time.Time) string + + // returns the full date representation of 't' for locale + FmtDateFull(t time.Time) string + + // returns the short time representation of 't' for locale + FmtTimeShort(t time.Time) string + + // returns the medium time representation of 't' for locale + FmtTimeMedium(t time.Time) string + + // returns the long time representation of 't' for locale + FmtTimeLong(t time.Time) string + + // returns the full time representation of 't' for locale + FmtTimeFull(t time.Time) string +} + +// String returns the string value of PluralRule +func (p PluralRule) String() string { + + switch p { + case PluralRuleZero: + return pluralsString[7:11] + case PluralRuleOne: + return pluralsString[11:14] + case PluralRuleTwo: + return pluralsString[14:17] + case PluralRuleFew: + return pluralsString[17:20] + case PluralRuleMany: + return pluralsString[20:24] + case PluralRuleOther: + return pluralsString[24:] + default: + return pluralsString[:7] + } +} + +// +// Precision Notes: +// +// must specify a precision >= 0, and here is why https://play.golang.org/p/LyL90U0Vyh +// +// v := float64(3.141) +// i := float64(int64(v)) +// +// fmt.Println(v - i) +// +// or +// +// s := strconv.FormatFloat(v-i, 'f', -1, 64) +// fmt.Println(s) +// +// these will not print what you'd expect: 0.14100000000000001 +// and so this library requires a precision to be specified, or +// inaccurate plural rules could be applied. +// +// +// +// n - absolute value of the source number (integer and decimals). +// i - integer digits of n. +// v - number of visible fraction digits in n, with trailing zeros. +// w - number of visible fraction digits in n, without trailing zeros. +// f - visible fractional digits in n, with trailing zeros. +// t - visible fractional digits in n, without trailing zeros. +// +// +// Func(num float64, v uint64) // v = digits/precision and prevents -1 as a special case as this can lead to very unexpected behaviour, see precision note's above. +// +// n := math.Abs(num) +// i := int64(n) +// v := v +// +// +// w := strconv.FormatFloat(num-float64(i), 'f', int(v), 64) // then parse backwards on string until no more zero's.... +// f := strconv.FormatFloat(n, 'f', int(v), 64) // then turn everything after decimal into an int64 +// t := strconv.FormatFloat(n, 'f', int(v), 64) // then parse backwards on string until no more zero's.... +// +// +// +// General Inclusion Rules +// - v will always be available inherently +// - all require n +// - w requires i +// + +// W returns the number of visible fraction digits in N, without trailing zeros. +func W(n float64, v uint64) (w int64) { + + s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) + + // with either be '0' or '0.xxxx', so if 1 then w will be zero + // otherwise need to parse + if len(s) != 1 { + + s = s[2:] + end := len(s) + 1 + + for i := end; i >= 0; i-- { + if s[i] != '0' { + end = i + 1 + break + } + } + + w = int64(len(s[:end])) + } + + return +} + +// F returns the visible fractional digits in N, with trailing zeros. +func F(n float64, v uint64) (f int64) { + + s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) + + // with either be '0' or '0.xxxx', so if 1 then f will be zero + // otherwise need to parse + if len(s) != 1 { + + // ignoring error, because it can't fail as we generated + // the string internally from a real number + f, _ = strconv.ParseInt(s[2:], 10, 64) + } + + return +} + +// T returns the visible fractional digits in N, without trailing zeros. +func T(n float64, v uint64) (t int64) { + + s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) + + // with either be '0' or '0.xxxx', so if 1 then t will be zero + // otherwise need to parse + if len(s) != 1 { + + s = s[2:] + end := len(s) + 1 + + for i := end; i >= 0; i-- { + if s[i] != '0' { + end = i + 1 + break + } + } + + // ignoring error, because it can't fail as we generated + // the string internally from a real number + t, _ = strconv.ParseInt(s[:end], 10, 64) + } + + return +} diff --git a/vendor/github.com/go-playground/universal-translator/.gitignore b/vendor/github.com/go-playground/universal-translator/.gitignore new file mode 100644 index 00000000..bc4e07f3 --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/.gitignore @@ -0,0 +1,25 @@ +# 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 +*.test +*.prof +*.coverprofile \ No newline at end of file diff --git a/vendor/github.com/go-playground/universal-translator/.travis.yml b/vendor/github.com/go-playground/universal-translator/.travis.yml new file mode 100644 index 00000000..39b8b923 --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/.travis.yml @@ -0,0 +1,27 @@ +language: go +go: + - 1.13.4 + - tip +matrix: + allow_failures: + - go: tip + +notifications: + email: + recipients: dean.karn@gmail.com + on_success: change + on_failure: always + +before_install: + - go install github.com/mattn/goveralls + +# Only clone the most recent commit. +git: + depth: 1 + +script: + - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./... + +after_success: | + [ $TRAVIS_GO_VERSION = 1.13.4 ] && + goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file diff --git a/vendor/github.com/go-playground/universal-translator/LICENSE b/vendor/github.com/go-playground/universal-translator/LICENSE new file mode 100644 index 00000000..8d8aba15 --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Go Playground + +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/go-playground/universal-translator/Makefile b/vendor/github.com/go-playground/universal-translator/Makefile new file mode 100644 index 00000000..ec3455bd --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/Makefile @@ -0,0 +1,18 @@ +GOCMD=GO111MODULE=on go + +linters-install: + @golangci-lint --version >/dev/null 2>&1 || { \ + echo "installing linting tools..."; \ + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s v1.41.1; \ + } + +lint: linters-install + golangci-lint run + +test: + $(GOCMD) test -cover -race ./... + +bench: + $(GOCMD) test -bench=. -benchmem ./... + +.PHONY: test lint linters-install \ No newline at end of file diff --git a/vendor/github.com/go-playground/universal-translator/README.md b/vendor/github.com/go-playground/universal-translator/README.md new file mode 100644 index 00000000..d9b66547 --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/README.md @@ -0,0 +1,87 @@ +## universal-translator +![Project status](https://img.shields.io/badge/version-0.18.1-green.svg) +[![Coverage Status](https://coveralls.io/repos/github/go-playground/universal-translator/badge.svg)](https://coveralls.io/github/go-playground/universal-translator) +[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/universal-translator)](https://goreportcard.com/report/github.com/go-playground/universal-translator) +[![GoDoc](https://godoc.org/github.com/go-playground/universal-translator?status.svg)](https://godoc.org/github.com/go-playground/universal-translator) +![License](https://img.shields.io/dub/l/vibe-d.svg) + +Universal Translator is an i18n Translator for Go/Golang using CLDR data + pluralization rules + +Why another i18n library? +-------------------------- +Because none of the plural rules seem to be correct out there, including the previous implementation of this package, +so I took it upon myself to create [locales](https://github.com/go-playground/locales) for everyone to use; this package +is a thin wrapper around [locales](https://github.com/go-playground/locales) in order to store and translate text for +use in your applications. + +Features +-------- +- [x] Rules generated from the [CLDR](http://cldr.unicode.org/index/downloads) data, v36.0.1 +- [x] Contains Cardinal, Ordinal and Range Plural Rules +- [x] Contains Month, Weekday and Timezone translations built in +- [x] Contains Date & Time formatting functions +- [x] Contains Number, Currency, Accounting and Percent formatting functions +- [x] Supports the "Gregorian" calendar only ( my time isn't unlimited, had to draw the line somewhere ) +- [x] Support loading translations from files +- [x] Exporting translations to file(s), mainly for getting them professionally translated +- [ ] Code Generation for translation files -> Go code.. i.e. after it has been professionally translated +- [ ] Tests for all languages, I need help with this, please see [here](https://github.com/go-playground/locales/issues/1) + +Installation +----------- + +Use go get + +```shell +go get github.com/go-playground/universal-translator +``` + +Usage & Documentation +------- + +Please see https://godoc.org/github.com/go-playground/universal-translator for usage docs + +##### Examples: + +- [Basic](https://github.com/go-playground/universal-translator/tree/master/_examples/basic) +- [Full - no files](https://github.com/go-playground/universal-translator/tree/master/_examples/full-no-files) +- [Full - with files](https://github.com/go-playground/universal-translator/tree/master/_examples/full-with-files) + +File formatting +-------------- +All types, Plain substitution, Cardinal, Ordinal and Range translations can all be contained within the same file(s); +they are only separated for easy viewing. + +##### Examples: + +- [Formats](https://github.com/go-playground/universal-translator/tree/master/_examples/file-formats) + +##### Basic Makeup +NOTE: not all fields are needed for all translation types, see [examples](https://github.com/go-playground/universal-translator/tree/master/_examples/file-formats) +```json +{ + "locale": "en", + "key": "days-left", + "trans": "You have {0} day left.", + "type": "Cardinal", + "rule": "One", + "override": false +} +``` +|Field|Description| +|---|---| +|locale|The locale for which the translation is for.| +|key|The translation key that will be used to store and lookup each translation; normally it is a string or integer.| +|trans|The actual translation text.| +|type|The type of translation Cardinal, Ordinal, Range or "" for a plain substitution(not required to be defined if plain used)| +|rule|The plural rule for which the translation is for eg. One, Two, Few, Many or Other.(not required to be defined if plain used)| +|override|If you wish to override an existing translation that has already been registered, set this to 'true'. 99% of the time there is no need to define it.| + +Help With Tests +--------------- +To anyone interesting in helping or contributing, I sure could use some help creating tests for each language. +Please see issue [here](https://github.com/go-playground/locales/issues/1) for details. + +License +------ +Distributed under MIT License, please see license file in code for more details. diff --git a/vendor/github.com/go-playground/universal-translator/errors.go b/vendor/github.com/go-playground/universal-translator/errors.go new file mode 100644 index 00000000..38b163b6 --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/errors.go @@ -0,0 +1,148 @@ +package ut + +import ( + "errors" + "fmt" + + "github.com/go-playground/locales" +) + +var ( + // ErrUnknowTranslation indicates the translation could not be found + ErrUnknowTranslation = errors.New("Unknown Translation") +) + +var _ error = new(ErrConflictingTranslation) +var _ error = new(ErrRangeTranslation) +var _ error = new(ErrOrdinalTranslation) +var _ error = new(ErrCardinalTranslation) +var _ error = new(ErrMissingPluralTranslation) +var _ error = new(ErrExistingTranslator) + +// ErrExistingTranslator is the error representing a conflicting translator +type ErrExistingTranslator struct { + locale string +} + +// Error returns ErrExistingTranslator's internal error text +func (e *ErrExistingTranslator) Error() string { + return fmt.Sprintf("error: conflicting translator for locale '%s'", e.locale) +} + +// ErrConflictingTranslation is the error representing a conflicting translation +type ErrConflictingTranslation struct { + locale string + key interface{} + rule locales.PluralRule + text string +} + +// Error returns ErrConflictingTranslation's internal error text +func (e *ErrConflictingTranslation) Error() string { + + if _, ok := e.key.(string); !ok { + return fmt.Sprintf("error: conflicting key '%#v' rule '%s' with text '%s' for locale '%s', value being ignored", e.key, e.rule, e.text, e.locale) + } + + return fmt.Sprintf("error: conflicting key '%s' rule '%s' with text '%s' for locale '%s', value being ignored", e.key, e.rule, e.text, e.locale) +} + +// ErrRangeTranslation is the error representing a range translation error +type ErrRangeTranslation struct { + text string +} + +// Error returns ErrRangeTranslation's internal error text +func (e *ErrRangeTranslation) Error() string { + return e.text +} + +// ErrOrdinalTranslation is the error representing an ordinal translation error +type ErrOrdinalTranslation struct { + text string +} + +// Error returns ErrOrdinalTranslation's internal error text +func (e *ErrOrdinalTranslation) Error() string { + return e.text +} + +// ErrCardinalTranslation is the error representing a cardinal translation error +type ErrCardinalTranslation struct { + text string +} + +// Error returns ErrCardinalTranslation's internal error text +func (e *ErrCardinalTranslation) Error() string { + return e.text +} + +// ErrMissingPluralTranslation is the error signifying a missing translation given +// the locales plural rules. +type ErrMissingPluralTranslation struct { + locale string + key interface{} + rule locales.PluralRule + translationType string +} + +// Error returns ErrMissingPluralTranslation's internal error text +func (e *ErrMissingPluralTranslation) Error() string { + + if _, ok := e.key.(string); !ok { + return fmt.Sprintf("error: missing '%s' plural rule '%s' for translation with key '%#v' and locale '%s'", e.translationType, e.rule, e.key, e.locale) + } + + return fmt.Sprintf("error: missing '%s' plural rule '%s' for translation with key '%s' and locale '%s'", e.translationType, e.rule, e.key, e.locale) +} + +// ErrMissingBracket is the error representing a missing bracket in a translation +// eg. This is a {0 <-- missing ending '}' +type ErrMissingBracket struct { + locale string + key interface{} + text string +} + +// Error returns ErrMissingBracket error message +func (e *ErrMissingBracket) Error() string { + return fmt.Sprintf("error: missing bracket '{}', in translation. locale: '%s' key: '%v' text: '%s'", e.locale, e.key, e.text) +} + +// ErrBadParamSyntax is the error representing a bad parameter definition in a translation +// eg. This is a {must-be-int} +type ErrBadParamSyntax struct { + locale string + param string + key interface{} + text string +} + +// Error returns ErrBadParamSyntax error message +func (e *ErrBadParamSyntax) Error() string { + return fmt.Sprintf("error: bad parameter syntax, missing parameter '%s' in translation. locale: '%s' key: '%v' text: '%s'", e.param, e.locale, e.key, e.text) +} + +// import/export errors + +// ErrMissingLocale is the error representing an expected locale that could +// not be found aka locale not registered with the UniversalTranslator Instance +type ErrMissingLocale struct { + locale string +} + +// Error returns ErrMissingLocale's internal error text +func (e *ErrMissingLocale) Error() string { + return fmt.Sprintf("error: locale '%s' not registered.", e.locale) +} + +// ErrBadPluralDefinition is the error representing an incorrect plural definition +// usually found within translations defined within files during the import process. +type ErrBadPluralDefinition struct { + tl translation +} + +// Error returns ErrBadPluralDefinition's internal error text +func (e *ErrBadPluralDefinition) Error() string { + return fmt.Sprintf("error: bad plural definition '%#v'", e.tl) +} diff --git a/vendor/github.com/go-playground/universal-translator/import_export.go b/vendor/github.com/go-playground/universal-translator/import_export.go new file mode 100644 index 00000000..87a1b465 --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/import_export.go @@ -0,0 +1,274 @@ +package ut + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + + "io" + + "github.com/go-playground/locales" +) + +type translation struct { + Locale string `json:"locale"` + Key interface{} `json:"key"` // either string or integer + Translation string `json:"trans"` + PluralType string `json:"type,omitempty"` + PluralRule string `json:"rule,omitempty"` + OverrideExisting bool `json:"override,omitempty"` +} + +const ( + cardinalType = "Cardinal" + ordinalType = "Ordinal" + rangeType = "Range" +) + +// ImportExportFormat is the format of the file import or export +type ImportExportFormat uint8 + +// supported Export Formats +const ( + FormatJSON ImportExportFormat = iota +) + +// Export writes the translations out to a file on disk. +// +// NOTE: this currently only works with string or int translations keys. +func (t *UniversalTranslator) Export(format ImportExportFormat, dirname string) error { + + _, err := os.Stat(dirname) + if err != nil { + + if !os.IsNotExist(err) { + return err + } + + if err = os.MkdirAll(dirname, 0744); err != nil { + return err + } + } + + // build up translations + var trans []translation + var b []byte + var ext string + + for _, locale := range t.translators { + + for k, v := range locale.(*translator).translations { + trans = append(trans, translation{ + Locale: locale.Locale(), + Key: k, + Translation: v.text, + }) + } + + for k, pluralTrans := range locale.(*translator).cardinalTanslations { + + for i, plural := range pluralTrans { + + // leave enough for all plural rules + // but not all are set for all languages. + if plural == nil { + continue + } + + trans = append(trans, translation{ + Locale: locale.Locale(), + Key: k.(string), + Translation: plural.text, + PluralType: cardinalType, + PluralRule: locales.PluralRule(i).String(), + }) + } + } + + for k, pluralTrans := range locale.(*translator).ordinalTanslations { + + for i, plural := range pluralTrans { + + // leave enough for all plural rules + // but not all are set for all languages. + if plural == nil { + continue + } + + trans = append(trans, translation{ + Locale: locale.Locale(), + Key: k.(string), + Translation: plural.text, + PluralType: ordinalType, + PluralRule: locales.PluralRule(i).String(), + }) + } + } + + for k, pluralTrans := range locale.(*translator).rangeTanslations { + + for i, plural := range pluralTrans { + + // leave enough for all plural rules + // but not all are set for all languages. + if plural == nil { + continue + } + + trans = append(trans, translation{ + Locale: locale.Locale(), + Key: k.(string), + Translation: plural.text, + PluralType: rangeType, + PluralRule: locales.PluralRule(i).String(), + }) + } + } + + switch format { + case FormatJSON: + b, err = json.MarshalIndent(trans, "", " ") + ext = ".json" + } + + if err != nil { + return err + } + + err = os.WriteFile(filepath.Join(dirname, fmt.Sprintf("%s%s", locale.Locale(), ext)), b, 0644) + if err != nil { + return err + } + + trans = trans[0:0] + } + + return nil +} + +// Import reads the translations out of a file or directory on disk. +// +// NOTE: this currently only works with string or int translations keys. +func (t *UniversalTranslator) Import(format ImportExportFormat, dirnameOrFilename string) error { + + fi, err := os.Stat(dirnameOrFilename) + if err != nil { + return err + } + + processFn := func(filename string) error { + + f, err := os.Open(filename) + if err != nil { + return err + } + defer f.Close() + + return t.ImportByReader(format, f) + } + + if !fi.IsDir() { + return processFn(dirnameOrFilename) + } + + // recursively go through directory + walker := func(path string, info os.FileInfo, err error) error { + + if info.IsDir() { + return nil + } + + switch format { + case FormatJSON: + // skip non JSON files + if filepath.Ext(info.Name()) != ".json" { + return nil + } + } + + return processFn(path) + } + + return filepath.Walk(dirnameOrFilename, walker) +} + +// ImportByReader imports the the translations found within the contents read from the supplied reader. +// +// NOTE: generally used when assets have been embedded into the binary and are already in memory. +func (t *UniversalTranslator) ImportByReader(format ImportExportFormat, reader io.Reader) error { + + b, err := io.ReadAll(reader) + if err != nil { + return err + } + + var trans []translation + + switch format { + case FormatJSON: + err = json.Unmarshal(b, &trans) + } + + if err != nil { + return err + } + + for _, tl := range trans { + + locale, found := t.FindTranslator(tl.Locale) + if !found { + return &ErrMissingLocale{locale: tl.Locale} + } + + pr := stringToPR(tl.PluralRule) + + if pr == locales.PluralRuleUnknown { + + err = locale.Add(tl.Key, tl.Translation, tl.OverrideExisting) + if err != nil { + return err + } + + continue + } + + switch tl.PluralType { + case cardinalType: + err = locale.AddCardinal(tl.Key, tl.Translation, pr, tl.OverrideExisting) + case ordinalType: + err = locale.AddOrdinal(tl.Key, tl.Translation, pr, tl.OverrideExisting) + case rangeType: + err = locale.AddRange(tl.Key, tl.Translation, pr, tl.OverrideExisting) + default: + return &ErrBadPluralDefinition{tl: tl} + } + + if err != nil { + return err + } + } + + return nil +} + +func stringToPR(s string) locales.PluralRule { + + switch s { + case "Zero": + return locales.PluralRuleZero + case "One": + return locales.PluralRuleOne + case "Two": + return locales.PluralRuleTwo + case "Few": + return locales.PluralRuleFew + case "Many": + return locales.PluralRuleMany + case "Other": + return locales.PluralRuleOther + default: + return locales.PluralRuleUnknown + } + +} diff --git a/vendor/github.com/go-playground/universal-translator/logo.png b/vendor/github.com/go-playground/universal-translator/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..61a6746fda76f0cd3f75322d54648cab74c8b8c1 GIT binary patch literal 16597 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 Y1qy*Tm&xvVWB>pF07*qoM6N<$f&kHd9{>OV literal 0 HcmV?d00001 diff --git a/vendor/github.com/go-playground/universal-translator/translator.go b/vendor/github.com/go-playground/universal-translator/translator.go new file mode 100644 index 00000000..24b18db9 --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/translator.go @@ -0,0 +1,420 @@ +package ut + +import ( + "fmt" + "strconv" + "strings" + + "github.com/go-playground/locales" +) + +const ( + paramZero = "{0}" + paramOne = "{1}" + unknownTranslation = "" +) + +// Translator is universal translators +// translator instance which is a thin wrapper +// around locales.Translator instance providing +// some extra functionality +type Translator interface { + locales.Translator + + // adds a normal translation for a particular language/locale + // {#} is the only replacement type accepted and are ad infinitum + // eg. one: '{0} day left' other: '{0} days left' + Add(key interface{}, text string, override bool) error + + // adds a cardinal plural translation for a particular language/locale + // {0} is the only replacement type accepted and only one variable is accepted as + // multiple cannot be used for a plural rule determination, unless it is a range; + // see AddRange below. + // eg. in locale 'en' one: '{0} day left' other: '{0} days left' + AddCardinal(key interface{}, text string, rule locales.PluralRule, override bool) error + + // adds an ordinal plural translation for a particular language/locale + // {0} is the only replacement type accepted and only one variable is accepted as + // multiple cannot be used for a plural rule determination, unless it is a range; + // see AddRange below. + // eg. in locale 'en' one: '{0}st day of spring' other: '{0}nd day of spring' + // - 1st, 2nd, 3rd... + AddOrdinal(key interface{}, text string, rule locales.PluralRule, override bool) error + + // adds a range plural translation for a particular language/locale + // {0} and {1} are the only replacement types accepted and only these are accepted. + // eg. in locale 'nl' one: '{0}-{1} day left' other: '{0}-{1} days left' + AddRange(key interface{}, text string, rule locales.PluralRule, override bool) error + + // creates the translation for the locale given the 'key' and params passed in + T(key interface{}, params ...string) (string, error) + + // creates the cardinal translation for the locale given the 'key', 'num' and 'digit' arguments + // and param passed in + C(key interface{}, num float64, digits uint64, param string) (string, error) + + // creates the ordinal translation for the locale given the 'key', 'num' and 'digit' arguments + // and param passed in + O(key interface{}, num float64, digits uint64, param string) (string, error) + + // creates the range translation for the locale given the 'key', 'num1', 'digit1', 'num2' and + // 'digit2' arguments and 'param1' and 'param2' passed in + R(key interface{}, num1 float64, digits1 uint64, num2 float64, digits2 uint64, param1, param2 string) (string, error) + + // VerifyTranslations checks to ensures that no plural rules have been + // missed within the translations. + VerifyTranslations() error +} + +var _ Translator = new(translator) +var _ locales.Translator = new(translator) + +type translator struct { + locales.Translator + translations map[interface{}]*transText + cardinalTanslations map[interface{}][]*transText // array index is mapped to locales.PluralRule index + the locales.PluralRuleUnknown + ordinalTanslations map[interface{}][]*transText + rangeTanslations map[interface{}][]*transText +} + +type transText struct { + text string + indexes []int +} + +func newTranslator(trans locales.Translator) Translator { + return &translator{ + Translator: trans, + translations: make(map[interface{}]*transText), // translation text broken up by byte index + cardinalTanslations: make(map[interface{}][]*transText), + ordinalTanslations: make(map[interface{}][]*transText), + rangeTanslations: make(map[interface{}][]*transText), + } +} + +// Add adds a normal translation for a particular language/locale +// {#} is the only replacement type accepted and are ad infinitum +// eg. one: '{0} day left' other: '{0} days left' +func (t *translator) Add(key interface{}, text string, override bool) error { + + if _, ok := t.translations[key]; ok && !override { + return &ErrConflictingTranslation{locale: t.Locale(), key: key, text: text} + } + + lb := strings.Count(text, "{") + rb := strings.Count(text, "}") + + if lb != rb { + return &ErrMissingBracket{locale: t.Locale(), key: key, text: text} + } + + trans := &transText{ + text: text, + } + + var idx int + + for i := 0; i < lb; i++ { + s := "{" + strconv.Itoa(i) + "}" + idx = strings.Index(text, s) + if idx == -1 { + return &ErrBadParamSyntax{locale: t.Locale(), param: s, key: key, text: text} + } + + trans.indexes = append(trans.indexes, idx) + trans.indexes = append(trans.indexes, idx+len(s)) + } + + t.translations[key] = trans + + return nil +} + +// AddCardinal adds a cardinal plural translation for a particular language/locale +// {0} is the only replacement type accepted and only one variable is accepted as +// multiple cannot be used for a plural rule determination, unless it is a range; +// see AddRange below. +// eg. in locale 'en' one: '{0} day left' other: '{0} days left' +func (t *translator) AddCardinal(key interface{}, text string, rule locales.PluralRule, override bool) error { + + var verified bool + + // verify plural rule exists for locale + for _, pr := range t.PluralsCardinal() { + if pr == rule { + verified = true + break + } + } + + if !verified { + return &ErrCardinalTranslation{text: fmt.Sprintf("error: cardinal plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)} + } + + tarr, ok := t.cardinalTanslations[key] + if ok { + // verify not adding a conflicting record + if len(tarr) > 0 && tarr[rule] != nil && !override { + return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} + } + + } else { + tarr = make([]*transText, 7) + t.cardinalTanslations[key] = tarr + } + + trans := &transText{ + text: text, + indexes: make([]int, 2), + } + + tarr[rule] = trans + + idx := strings.Index(text, paramZero) + if idx == -1 { + tarr[rule] = nil + return &ErrCardinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddCardinal'. locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} + } + + trans.indexes[0] = idx + trans.indexes[1] = idx + len(paramZero) + + return nil +} + +// AddOrdinal adds an ordinal plural translation for a particular language/locale +// {0} is the only replacement type accepted and only one variable is accepted as +// multiple cannot be used for a plural rule determination, unless it is a range; +// see AddRange below. +// eg. in locale 'en' one: '{0}st day of spring' other: '{0}nd day of spring' - 1st, 2nd, 3rd... +func (t *translator) AddOrdinal(key interface{}, text string, rule locales.PluralRule, override bool) error { + + var verified bool + + // verify plural rule exists for locale + for _, pr := range t.PluralsOrdinal() { + if pr == rule { + verified = true + break + } + } + + if !verified { + return &ErrOrdinalTranslation{text: fmt.Sprintf("error: ordinal plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)} + } + + tarr, ok := t.ordinalTanslations[key] + if ok { + // verify not adding a conflicting record + if len(tarr) > 0 && tarr[rule] != nil && !override { + return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} + } + + } else { + tarr = make([]*transText, 7) + t.ordinalTanslations[key] = tarr + } + + trans := &transText{ + text: text, + indexes: make([]int, 2), + } + + tarr[rule] = trans + + idx := strings.Index(text, paramZero) + if idx == -1 { + tarr[rule] = nil + return &ErrOrdinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddOrdinal'. locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} + } + + trans.indexes[0] = idx + trans.indexes[1] = idx + len(paramZero) + + return nil +} + +// AddRange adds a range plural translation for a particular language/locale +// {0} and {1} are the only replacement types accepted and only these are accepted. +// eg. in locale 'nl' one: '{0}-{1} day left' other: '{0}-{1} days left' +func (t *translator) AddRange(key interface{}, text string, rule locales.PluralRule, override bool) error { + + var verified bool + + // verify plural rule exists for locale + for _, pr := range t.PluralsRange() { + if pr == rule { + verified = true + break + } + } + + if !verified { + return &ErrRangeTranslation{text: fmt.Sprintf("error: range plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)} + } + + tarr, ok := t.rangeTanslations[key] + if ok { + // verify not adding a conflicting record + if len(tarr) > 0 && tarr[rule] != nil && !override { + return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} + } + + } else { + tarr = make([]*transText, 7) + t.rangeTanslations[key] = tarr + } + + trans := &transText{ + text: text, + indexes: make([]int, 4), + } + + tarr[rule] = trans + + idx := strings.Index(text, paramZero) + if idx == -1 { + tarr[rule] = nil + return &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, are you sure you're adding a Range Translation? locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} + } + + trans.indexes[0] = idx + trans.indexes[1] = idx + len(paramZero) + + idx = strings.Index(text, paramOne) + if idx == -1 { + tarr[rule] = nil + return &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, a Range Translation requires two parameters. locale: '%s' key: '%v' text: '%s'", paramOne, t.Locale(), key, text)} + } + + trans.indexes[2] = idx + trans.indexes[3] = idx + len(paramOne) + + return nil +} + +// T creates the translation for the locale given the 'key' and params passed in +func (t *translator) T(key interface{}, params ...string) (string, error) { + + trans, ok := t.translations[key] + if !ok { + return unknownTranslation, ErrUnknowTranslation + } + + b := make([]byte, 0, 64) + + var start, end, count int + + for i := 0; i < len(trans.indexes); i++ { + end = trans.indexes[i] + b = append(b, trans.text[start:end]...) + b = append(b, params[count]...) + i++ + start = trans.indexes[i] + count++ + } + + b = append(b, trans.text[start:]...) + + return string(b), nil +} + +// C creates the cardinal translation for the locale given the 'key', 'num' and 'digit' arguments and param passed in +func (t *translator) C(key interface{}, num float64, digits uint64, param string) (string, error) { + + tarr, ok := t.cardinalTanslations[key] + if !ok { + return unknownTranslation, ErrUnknowTranslation + } + + rule := t.CardinalPluralRule(num, digits) + + trans := tarr[rule] + + b := make([]byte, 0, 64) + b = append(b, trans.text[:trans.indexes[0]]...) + b = append(b, param...) + b = append(b, trans.text[trans.indexes[1]:]...) + + return string(b), nil +} + +// O creates the ordinal translation for the locale given the 'key', 'num' and 'digit' arguments and param passed in +func (t *translator) O(key interface{}, num float64, digits uint64, param string) (string, error) { + + tarr, ok := t.ordinalTanslations[key] + if !ok { + return unknownTranslation, ErrUnknowTranslation + } + + rule := t.OrdinalPluralRule(num, digits) + + trans := tarr[rule] + + b := make([]byte, 0, 64) + b = append(b, trans.text[:trans.indexes[0]]...) + b = append(b, param...) + b = append(b, trans.text[trans.indexes[1]:]...) + + return string(b), nil +} + +// R creates the range translation for the locale given the 'key', 'num1', 'digit1', 'num2' and 'digit2' arguments +// and 'param1' and 'param2' passed in +func (t *translator) R(key interface{}, num1 float64, digits1 uint64, num2 float64, digits2 uint64, param1, param2 string) (string, error) { + + tarr, ok := t.rangeTanslations[key] + if !ok { + return unknownTranslation, ErrUnknowTranslation + } + + rule := t.RangePluralRule(num1, digits1, num2, digits2) + + trans := tarr[rule] + + b := make([]byte, 0, 64) + b = append(b, trans.text[:trans.indexes[0]]...) + b = append(b, param1...) + b = append(b, trans.text[trans.indexes[1]:trans.indexes[2]]...) + b = append(b, param2...) + b = append(b, trans.text[trans.indexes[3]:]...) + + return string(b), nil +} + +// VerifyTranslations checks to ensures that no plural rules have been +// missed within the translations. +func (t *translator) VerifyTranslations() error { + + for k, v := range t.cardinalTanslations { + + for _, rule := range t.PluralsCardinal() { + + if v[rule] == nil { + return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "plural", rule: rule, key: k} + } + } + } + + for k, v := range t.ordinalTanslations { + + for _, rule := range t.PluralsOrdinal() { + + if v[rule] == nil { + return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "ordinal", rule: rule, key: k} + } + } + } + + for k, v := range t.rangeTanslations { + + for _, rule := range t.PluralsRange() { + + if v[rule] == nil { + return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "range", rule: rule, key: k} + } + } + } + + return nil +} diff --git a/vendor/github.com/go-playground/universal-translator/universal_translator.go b/vendor/github.com/go-playground/universal-translator/universal_translator.go new file mode 100644 index 00000000..dbf707f5 --- /dev/null +++ b/vendor/github.com/go-playground/universal-translator/universal_translator.go @@ -0,0 +1,113 @@ +package ut + +import ( + "strings" + + "github.com/go-playground/locales" +) + +// UniversalTranslator holds all locale & translation data +type UniversalTranslator struct { + translators map[string]Translator + fallback Translator +} + +// New returns a new UniversalTranslator instance set with +// the fallback locale and locales it should support +func New(fallback locales.Translator, supportedLocales ...locales.Translator) *UniversalTranslator { + + t := &UniversalTranslator{ + translators: make(map[string]Translator), + } + + for _, v := range supportedLocales { + + trans := newTranslator(v) + t.translators[strings.ToLower(trans.Locale())] = trans + + if fallback.Locale() == v.Locale() { + t.fallback = trans + } + } + + if t.fallback == nil && fallback != nil { + t.fallback = newTranslator(fallback) + } + + return t +} + +// FindTranslator trys to find a Translator based on an array of locales +// and returns the first one it can find, otherwise returns the +// fallback translator. +func (t *UniversalTranslator) FindTranslator(locales ...string) (trans Translator, found bool) { + + for _, locale := range locales { + + if trans, found = t.translators[strings.ToLower(locale)]; found { + return + } + } + + return t.fallback, false +} + +// GetTranslator returns the specified translator for the given locale, +// or fallback if not found +func (t *UniversalTranslator) GetTranslator(locale string) (trans Translator, found bool) { + + if trans, found = t.translators[strings.ToLower(locale)]; found { + return + } + + return t.fallback, false +} + +// GetFallback returns the fallback locale +func (t *UniversalTranslator) GetFallback() Translator { + return t.fallback +} + +// AddTranslator adds the supplied translator, if it already exists the override param +// will be checked and if false an error will be returned, otherwise the translator will be +// overridden; if the fallback matches the supplied translator it will be overridden as well +// NOTE: this is normally only used when translator is embedded within a library +func (t *UniversalTranslator) AddTranslator(translator locales.Translator, override bool) error { + + lc := strings.ToLower(translator.Locale()) + _, ok := t.translators[lc] + if ok && !override { + return &ErrExistingTranslator{locale: translator.Locale()} + } + + trans := newTranslator(translator) + + if t.fallback.Locale() == translator.Locale() { + + // because it's optional to have a fallback, I don't impose that limitation + // don't know why you wouldn't but... + if !override { + return &ErrExistingTranslator{locale: translator.Locale()} + } + + t.fallback = trans + } + + t.translators[lc] = trans + + return nil +} + +// VerifyTranslations runs through all locales and identifies any issues +// eg. missing plural rules for a locale +func (t *UniversalTranslator) VerifyTranslations() (err error) { + + for _, trans := range t.translators { + err = trans.VerifyTranslations() + if err != nil { + return + } + } + + return +} diff --git a/vendor/github.com/go-playground/validator/v10/.gitignore b/vendor/github.com/go-playground/validator/v10/.gitignore new file mode 100644 index 00000000..6305e529 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/.gitignore @@ -0,0 +1,32 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test +bin + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof +*.test +*.out +*.txt +/**/*.DS_Store +cover.html +README.html +.idea diff --git a/vendor/github.com/go-playground/validator/v10/LICENSE b/vendor/github.com/go-playground/validator/v10/LICENSE new file mode 100644 index 00000000..6a2ae9aa --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Dean Karn + +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/go-playground/validator/v10/MAINTAINERS.md b/vendor/github.com/go-playground/validator/v10/MAINTAINERS.md new file mode 100644 index 00000000..b809c4ce --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/MAINTAINERS.md @@ -0,0 +1,16 @@ +## Maintainers Guide + +### Semantic Versioning +Semantic versioning as defined [here](https://semver.org) must be strictly adhered to. + +### External Dependencies +Any new external dependencies MUST: +- Have a compatible LICENSE present. +- Be actively maintained. +- Be approved by @go-playground/admins + +### PR Merge Requirements +- Up-to-date branch. +- Passing tests and linting. +- CODEOWNERS approval. +- Tests that cover both the Happy and Unhappy paths. \ No newline at end of file diff --git a/vendor/github.com/go-playground/validator/v10/Makefile b/vendor/github.com/go-playground/validator/v10/Makefile new file mode 100644 index 00000000..e097dfaf --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/Makefile @@ -0,0 +1,18 @@ +GOCMD=go + +linters-install: + @golangci-lint --version >/dev/null 2>&1 || { \ + echo "installing linting tools..."; \ + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s v1.41.1; \ + } + +lint: linters-install + golangci-lint run + +test: + $(GOCMD) test -cover -race ./... + +bench: + $(GOCMD) test -run=NONE -bench=. -benchmem ./... + +.PHONY: test lint linters-install diff --git a/vendor/github.com/go-playground/validator/v10/README.md b/vendor/github.com/go-playground/validator/v10/README.md new file mode 100644 index 00000000..b0ac30d8 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/README.md @@ -0,0 +1,359 @@ +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.23.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) +[![GoDoc](https://godoc.org/github.com/go-playground/validator?status.svg)](https://pkg.go.dev/github.com/go-playground/validator/v10) +![License](https://img.shields.io/dub/l/vibe-d.svg) + +Package validator implements value validations for structs and individual fields based on tags. + +It has the following **unique** features: + +- Cross Field and Cross Struct validations by using validation tags or custom validators. +- Slice, Array and Map diving, which allows any or all levels of a multidimensional field to be validated. +- Ability to dive into both map keys and values for validation +- Handles type interface by determining it's underlying type prior to validation. +- Handles custom field types such as sql driver Valuer see [Valuer](https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29) +- Alias validation tags, which allows for mapping of several validations to a single tag for easier defining of validations on structs +- Extraction of custom defined Field Name e.g. can specify to extract the JSON name while validating and have it available in the resulting FieldError +- Customizable i18n aware error messages. +- Default validator for the [gin](https://github.com/gin-gonic/gin) web framework; upgrading from v8 to v9 in gin see [here](https://github.com/go-playground/validator/tree/master/_examples/gin-upgrading-overriding) + +Installation +------------ + +Use go get. + + go get github.com/go-playground/validator/v10 + +Then import the validator package into your own code. + + import "github.com/go-playground/validator/v10" + +Error Return Value +------- + +Validation functions return type error + +They return type error to avoid the issue discussed in the following, where err is always != nil: + +* http://stackoverflow.com/a/29138676/3158232 +* https://github.com/go-playground/validator/issues/134 + +Validator returns only InvalidValidationError for bad validation input, nil or ValidationErrors as type error; so, in your code all you need to do is check if the error returned is not nil, and if it's not check if error is InvalidValidationError ( if necessary, most of the time it isn't ) type cast it to type ValidationErrors like so: + +```go +err := validate.Struct(mystruct) +validationErrors := err.(validator.ValidationErrors) + ``` + +Usage and documentation +------ + +Please see https://pkg.go.dev/github.com/go-playground/validator/v10 for detailed usage docs. + +##### Examples: + +- [Simple](https://github.com/go-playground/validator/blob/master/_examples/simple/main.go) +- [Custom Field Types](https://github.com/go-playground/validator/blob/master/_examples/custom/main.go) +- [Struct Level](https://github.com/go-playground/validator/blob/master/_examples/struct-level/main.go) +- [Translations & Custom Errors](https://github.com/go-playground/validator/blob/master/_examples/translations/main.go) +- [Gin upgrade and/or override validator](https://github.com/go-playground/validator/tree/v9/_examples/gin-upgrading-overriding) +- [wash - an example application putting it all together](https://github.com/bluesuncorp/wash) + +Baked-in Validations +------ + +### Special Notes: +- If new to using validator it is highly recommended to initialize it using the `WithRequiredStructEnabled` option which is opt-in to new behaviour that will become the default behaviour in v11+. See documentation for more details. +```go +validate := validator.New(validator.WithRequiredStructEnabled()) +``` + +### Fields: + +| Tag | Description | +| - | - | +| eqcsfield | Field Equals Another Field (relative)| +| eqfield | Field Equals Another Field | +| fieldcontains | Check the indicated characters are present in the Field | +| fieldexcludes | Check the indicated characters are not present in the field | +| gtcsfield | Field Greater Than Another Relative Field | +| gtecsfield | Field Greater Than or Equal To Another Relative Field | +| gtefield | Field Greater Than or Equal To Another Field | +| gtfield | Field Greater Than Another Field | +| ltcsfield | Less Than Another Relative Field | +| ltecsfield | Less Than or Equal To Another Relative Field | +| ltefield | Less Than or Equal To Another Field | +| ltfield | Less Than Another Field | +| necsfield | Field Does Not Equal Another Field (relative) | +| nefield | Field Does Not Equal Another Field | + +### Network: + +| Tag | Description | +| - | - | +| cidr | Classless Inter-Domain Routing CIDR | +| cidrv4 | Classless Inter-Domain Routing CIDRv4 | +| cidrv6 | Classless Inter-Domain Routing CIDRv6 | +| datauri | Data URL | +| fqdn | Full Qualified Domain Name (FQDN) | +| hostname | Hostname RFC 952 | +| hostname_port | HostPort | +| hostname_rfc1123 | Hostname RFC 1123 | +| ip | Internet Protocol Address IP | +| ip4_addr | Internet Protocol Address IPv4 | +| ip6_addr | Internet Protocol Address IPv6 | +| ip_addr | Internet Protocol Address IP | +| ipv4 | Internet Protocol Address IPv4 | +| ipv6 | Internet Protocol Address IPv6 | +| mac | Media Access Control Address MAC | +| tcp4_addr | Transmission Control Protocol Address TCPv4 | +| tcp6_addr | Transmission Control Protocol Address TCPv6 | +| tcp_addr | Transmission Control Protocol Address TCP | +| udp4_addr | User Datagram Protocol Address UDPv4 | +| udp6_addr | User Datagram Protocol Address UDPv6 | +| udp_addr | User Datagram Protocol Address UDP | +| unix_addr | Unix domain socket end point Address | +| uri | URI String | +| url | URL String | +| http_url | HTTP URL String | +| url_encoded | URL Encoded | +| urn_rfc2141 | Urn RFC 2141 String | + +### Strings: + +| Tag | Description | +| - | - | +| alpha | Alpha Only | +| alphanum | Alphanumeric | +| alphanumunicode | Alphanumeric Unicode | +| alphaunicode | Alpha Unicode | +| ascii | ASCII | +| boolean | Boolean | +| contains | Contains | +| containsany | Contains Any | +| containsrune | Contains Rune | +| endsnotwith | Ends Not With | +| endswith | Ends With | +| excludes | Excludes | +| excludesall | Excludes All | +| excludesrune | Excludes Rune | +| lowercase | Lowercase | +| multibyte | Multi-Byte Characters | +| number | Number | +| numeric | Numeric | +| printascii | Printable ASCII | +| startsnotwith | Starts Not With | +| startswith | Starts With | +| uppercase | Uppercase | + +### Format: +| Tag | Description | +| - | - | +| base64 | Base64 String | +| base64url | Base64URL String | +| base64rawurl | Base64RawURL String | +| bic | Business Identifier Code (ISO 9362) | +| bcp47_language_tag | Language tag (BCP 47) | +| btc_addr | Bitcoin Address | +| btc_addr_bech32 | Bitcoin Bech32 Address (segwit) | +| credit_card | Credit Card Number | +| mongodb | MongoDB ObjectID | +| mongodb_connection_string | MongoDB Connection String | +| cron | Cron | +| spicedb | SpiceDb ObjectID/Permission/Type | +| datetime | Datetime | +| e164 | e164 formatted phone number | +| email | E-mail String +| eth_addr | Ethereum Address | +| hexadecimal | Hexadecimal String | +| hexcolor | Hexcolor String | +| hsl | HSL String | +| hsla | HSLA String | +| html | HTML Tags | +| html_encoded | HTML Encoded | +| 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) | +| iso3166_2 | Country subdivision code (ISO 3166-2) | +| iso4217 | Currency code (ISO 4217) | +| json | JSON | +| jwt | JSON Web Token (JWT) | +| latitude | Latitude | +| longitude | Longitude | +| luhn_checksum | Luhn Algorithm Checksum (for strings and (u)int) | +| postcode_iso3166_alpha2 | Postcode | +| postcode_iso3166_alpha2_field | Postcode | +| rgb | RGB String | +| rgba | RGBA String | +| ssn | Social Security Number SSN | +| timezone | Timezone | +| uuid | Universally Unique Identifier UUID | +| uuid3 | Universally Unique Identifier UUID v3 | +| uuid3_rfc4122 | Universally Unique Identifier UUID v3 RFC4122 | +| uuid4 | Universally Unique Identifier UUID v4 | +| uuid4_rfc4122 | Universally Unique Identifier UUID v4 RFC4122 | +| uuid5 | Universally Unique Identifier UUID v5 | +| uuid5_rfc4122 | Universally Unique Identifier UUID v5 RFC4122 | +| uuid_rfc4122 | Universally Unique Identifier UUID RFC4122 | +| md4 | MD4 hash | +| md5 | MD5 hash | +| sha256 | SHA256 hash | +| sha384 | SHA384 hash | +| sha512 | SHA512 hash | +| ripemd128 | RIPEMD-128 hash | +| ripemd128 | RIPEMD-160 hash | +| tiger128 | TIGER128 hash | +| tiger160 | TIGER160 hash | +| tiger192 | TIGER192 hash | +| semver | Semantic Versioning 2.0.0 | +| ulid | Universally Unique Lexicographically Sortable Identifier ULID | +| cve | Common Vulnerabilities and Exposures Identifier (CVE id) | + +### Comparisons: +| Tag | Description | +| - | - | +| eq | Equals | +| eq_ignore_case | Equals ignoring case | +| gt | Greater than| +| gte | Greater than or equal | +| lt | Less Than | +| lte | Less Than or Equal | +| ne | Not Equal | +| ne_ignore_case | Not Equal ignoring case | + +### Other: +| Tag | Description | +| - | - | +| dir | Existing Directory | +| dirpath | Directory Path | +| file | Existing File | +| filepath | File Path | +| image | Image | +| isdefault | Is Default | +| len | Length | +| max | Maximum | +| min | Minimum | +| oneof | One Of | +| required | Required | +| required_if | Required If | +| required_unless | Required Unless | +| required_with | Required With | +| required_with_all | Required With All | +| required_without | Required Without | +| required_without_all | Required Without All | +| excluded_if | Excluded If | +| excluded_unless | Excluded Unless | +| excluded_with | Excluded With | +| excluded_with_all | Excluded With All | +| excluded_without | Excluded Without | +| excluded_without_all | Excluded Without All | +| unique | Unique | + +#### Aliases: +| Tag | Description | +| - | - | +| iscolor | hexcolor\|rgb\|rgba\|hsl\|hsla | +| country_code | iso3166_1_alpha2\|iso3166_1_alpha3\|iso3166_1_alpha_numeric | + +Benchmarks +------ +###### Run on MacBook Pro (15-inch, 2017) go version go1.10.2 darwin/amd64 +```go +go version go1.21.0 darwin/arm64 +goos: darwin +goarch: arm64 +pkg: github.com/go-playground/validator/v10 +BenchmarkFieldSuccess-8 33142266 35.94 ns/op 0 B/op 0 allocs/op +BenchmarkFieldSuccessParallel-8 200816191 6.568 ns/op 0 B/op 0 allocs/op +BenchmarkFieldFailure-8 6779707 175.1 ns/op 200 B/op 4 allocs/op +BenchmarkFieldFailureParallel-8 11044147 108.4 ns/op 200 B/op 4 allocs/op +BenchmarkFieldArrayDiveSuccess-8 6054232 194.4 ns/op 97 B/op 5 allocs/op +BenchmarkFieldArrayDiveSuccessParallel-8 12523388 94.07 ns/op 97 B/op 5 allocs/op +BenchmarkFieldArrayDiveFailure-8 3587043 334.3 ns/op 300 B/op 10 allocs/op +BenchmarkFieldArrayDiveFailureParallel-8 5816665 200.8 ns/op 300 B/op 10 allocs/op +BenchmarkFieldMapDiveSuccess-8 2217910 540.1 ns/op 288 B/op 14 allocs/op +BenchmarkFieldMapDiveSuccessParallel-8 4446698 258.7 ns/op 288 B/op 14 allocs/op +BenchmarkFieldMapDiveFailure-8 2392759 504.6 ns/op 376 B/op 13 allocs/op +BenchmarkFieldMapDiveFailureParallel-8 4244199 286.9 ns/op 376 B/op 13 allocs/op +BenchmarkFieldMapDiveWithKeysSuccess-8 2005857 592.1 ns/op 288 B/op 14 allocs/op +BenchmarkFieldMapDiveWithKeysSuccessParallel-8 4400850 296.9 ns/op 288 B/op 14 allocs/op +BenchmarkFieldMapDiveWithKeysFailure-8 1850227 643.8 ns/op 553 B/op 16 allocs/op +BenchmarkFieldMapDiveWithKeysFailureParallel-8 3293233 375.1 ns/op 553 B/op 16 allocs/op +BenchmarkFieldCustomTypeSuccess-8 12174412 98.25 ns/op 32 B/op 2 allocs/op +BenchmarkFieldCustomTypeSuccessParallel-8 34389907 35.49 ns/op 32 B/op 2 allocs/op +BenchmarkFieldCustomTypeFailure-8 7582524 156.6 ns/op 184 B/op 3 allocs/op +BenchmarkFieldCustomTypeFailureParallel-8 13019902 92.79 ns/op 184 B/op 3 allocs/op +BenchmarkFieldOrTagSuccess-8 3427260 349.4 ns/op 16 B/op 1 allocs/op +BenchmarkFieldOrTagSuccessParallel-8 15144128 81.25 ns/op 16 B/op 1 allocs/op +BenchmarkFieldOrTagFailure-8 5913546 201.9 ns/op 216 B/op 5 allocs/op +BenchmarkFieldOrTagFailureParallel-8 9810212 113.7 ns/op 216 B/op 5 allocs/op +BenchmarkStructLevelValidationSuccess-8 13456327 87.66 ns/op 16 B/op 1 allocs/op +BenchmarkStructLevelValidationSuccessParallel-8 41818888 27.77 ns/op 16 B/op 1 allocs/op +BenchmarkStructLevelValidationFailure-8 4166284 272.6 ns/op 264 B/op 7 allocs/op +BenchmarkStructLevelValidationFailureParallel-8 7594581 152.1 ns/op 264 B/op 7 allocs/op +BenchmarkStructSimpleCustomTypeSuccess-8 6508082 182.6 ns/op 32 B/op 2 allocs/op +BenchmarkStructSimpleCustomTypeSuccessParallel-8 23078605 54.78 ns/op 32 B/op 2 allocs/op +BenchmarkStructSimpleCustomTypeFailure-8 3118352 381.0 ns/op 416 B/op 9 allocs/op +BenchmarkStructSimpleCustomTypeFailureParallel-8 5300738 224.1 ns/op 432 B/op 10 allocs/op +BenchmarkStructFilteredSuccess-8 4761807 251.1 ns/op 216 B/op 5 allocs/op +BenchmarkStructFilteredSuccessParallel-8 8792598 128.6 ns/op 216 B/op 5 allocs/op +BenchmarkStructFilteredFailure-8 5202573 232.1 ns/op 216 B/op 5 allocs/op +BenchmarkStructFilteredFailureParallel-8 9591267 121.4 ns/op 216 B/op 5 allocs/op +BenchmarkStructPartialSuccess-8 5188512 231.6 ns/op 224 B/op 4 allocs/op +BenchmarkStructPartialSuccessParallel-8 9179776 123.1 ns/op 224 B/op 4 allocs/op +BenchmarkStructPartialFailure-8 3071212 392.5 ns/op 440 B/op 9 allocs/op +BenchmarkStructPartialFailureParallel-8 5344261 223.7 ns/op 440 B/op 9 allocs/op +BenchmarkStructExceptSuccess-8 3184230 375.0 ns/op 424 B/op 8 allocs/op +BenchmarkStructExceptSuccessParallel-8 10090130 108.9 ns/op 208 B/op 3 allocs/op +BenchmarkStructExceptFailure-8 3347226 357.7 ns/op 424 B/op 8 allocs/op +BenchmarkStructExceptFailureParallel-8 5654923 209.5 ns/op 424 B/op 8 allocs/op +BenchmarkStructSimpleCrossFieldSuccess-8 5232265 229.1 ns/op 56 B/op 3 allocs/op +BenchmarkStructSimpleCrossFieldSuccessParallel-8 17436674 64.75 ns/op 56 B/op 3 allocs/op +BenchmarkStructSimpleCrossFieldFailure-8 3128613 383.6 ns/op 272 B/op 8 allocs/op +BenchmarkStructSimpleCrossFieldFailureParallel-8 6994113 168.8 ns/op 272 B/op 8 allocs/op +BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 3506487 340.9 ns/op 64 B/op 4 allocs/op +BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 13431300 91.77 ns/op 64 B/op 4 allocs/op +BenchmarkStructSimpleCrossStructCrossFieldFailure-8 2410566 500.9 ns/op 288 B/op 9 allocs/op +BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 6344510 188.2 ns/op 288 B/op 9 allocs/op +BenchmarkStructSimpleSuccess-8 8922726 133.8 ns/op 0 B/op 0 allocs/op +BenchmarkStructSimpleSuccessParallel-8 55291153 23.63 ns/op 0 B/op 0 allocs/op +BenchmarkStructSimpleFailure-8 3171553 378.4 ns/op 416 B/op 9 allocs/op +BenchmarkStructSimpleFailureParallel-8 5571692 212.0 ns/op 416 B/op 9 allocs/op +BenchmarkStructComplexSuccess-8 1683750 714.5 ns/op 224 B/op 5 allocs/op +BenchmarkStructComplexSuccessParallel-8 4578046 257.0 ns/op 224 B/op 5 allocs/op +BenchmarkStructComplexFailure-8 481585 2547 ns/op 3041 B/op 48 allocs/op +BenchmarkStructComplexFailureParallel-8 965764 1577 ns/op 3040 B/op 48 allocs/op +BenchmarkOneof-8 17380881 68.50 ns/op 0 B/op 0 allocs/op +BenchmarkOneofParallel-8 8084733 153.5 ns/op 0 B/op 0 allocs/op +``` + +Complementary Software +---------------------- + +Here is a list of software that complements using this library either pre or post validation. + +* [form](https://github.com/go-playground/form) - Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values. Dual Array and Full map support. +* [mold](https://github.com/go-playground/mold) - A general library to help modify or set data within data structures and other objects + +How to Contribute +------ + +Make a pull request... + +License +------- +Distributed under MIT License, please see license file within the code for more details. + +Maintainers +----------- +This project has grown large enough that more than one person is required to properly support the community. +If you are interested in becoming a maintainer please reach out to me https://github.com/deankarn diff --git a/vendor/github.com/go-playground/validator/v10/baked_in.go b/vendor/github.com/go-playground/validator/v10/baked_in.go new file mode 100644 index 00000000..2f66c183 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/baked_in.go @@ -0,0 +1,3046 @@ +package validator + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "io/fs" + "net" + "net/url" + "os" + "reflect" + "strconv" + "strings" + "sync" + "syscall" + "time" + "unicode/utf8" + + "golang.org/x/crypto/sha3" + "golang.org/x/text/language" + + "github.com/gabriel-vasile/mimetype" + urn "github.com/leodido/go-urn" +) + +// Func accepts a FieldLevel interface for all validation needs. The return +// value should be true when validation succeeds. +type Func func(fl FieldLevel) bool + +// FuncCtx accepts a context.Context and FieldLevel interface for all +// validation needs. The return value should be true when validation succeeds. +type FuncCtx func(ctx context.Context, fl FieldLevel) bool + +// wrapFunc wraps normal Func makes it compatible with FuncCtx +func wrapFunc(fn Func) FuncCtx { + if fn == nil { + return nil // be sure not to wrap a bad function. + } + return func(ctx context.Context, fl FieldLevel) bool { + return fn(fl) + } +} + +var ( + restrictedTags = map[string]struct{}{ + diveTag: {}, + keysTag: {}, + endKeysTag: {}, + structOnlyTag: {}, + omitempty: {}, + omitnil: {}, + skipValidationTag: {}, + utf8HexComma: {}, + utf8Pipe: {}, + noStructLevelTag: {}, + requiredTag: {}, + isdefault: {}, + } + + // bakedInAliases is a default mapping of a single validation tag that + // defines a common or complex set of validation(s) to simplify + // adding validation to structs. + bakedInAliases = map[string]string{ + "iscolor": "hexcolor|rgb|rgba|hsl|hsla", + "country_code": "iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric", + "eu_country_code": "iso3166_1_alpha2_eu|iso3166_1_alpha3_eu|iso3166_1_alpha_numeric_eu", + } + + // bakedInValidators is the default map of ValidationFunc + // you can add, remove or even replace items to suite your needs, + // or even disregard and use your own map if so desired. + bakedInValidators = map[string]Func{ + "required": hasValue, + "required_if": requiredIf, + "required_unless": requiredUnless, + "skip_unless": skipUnless, + "required_with": requiredWith, + "required_with_all": requiredWithAll, + "required_without": requiredWithout, + "required_without_all": requiredWithoutAll, + "excluded_if": excludedIf, + "excluded_unless": excludedUnless, + "excluded_with": excludedWith, + "excluded_with_all": excludedWithAll, + "excluded_without": excludedWithout, + "excluded_without_all": excludedWithoutAll, + "isdefault": isDefault, + "len": hasLengthOf, + "min": hasMinOf, + "max": hasMaxOf, + "eq": isEq, + "eq_ignore_case": isEqIgnoreCase, + "ne": isNe, + "ne_ignore_case": isNeIgnoreCase, + "lt": isLt, + "lte": isLte, + "gt": isGt, + "gte": isGte, + "eqfield": isEqField, + "eqcsfield": isEqCrossStructField, + "necsfield": isNeCrossStructField, + "gtcsfield": isGtCrossStructField, + "gtecsfield": isGteCrossStructField, + "ltcsfield": isLtCrossStructField, + "ltecsfield": isLteCrossStructField, + "nefield": isNeField, + "gtefield": isGteField, + "gtfield": isGtField, + "ltefield": isLteField, + "ltfield": isLtField, + "fieldcontains": fieldContains, + "fieldexcludes": fieldExcludes, + "alpha": isAlpha, + "alphanum": isAlphanum, + "alphaunicode": isAlphaUnicode, + "alphanumunicode": isAlphanumUnicode, + "boolean": isBoolean, + "numeric": isNumeric, + "number": isNumber, + "hexadecimal": isHexadecimal, + "hexcolor": isHEXColor, + "rgb": isRGB, + "rgba": isRGBA, + "hsl": isHSL, + "hsla": isHSLA, + "e164": isE164, + "email": isEmail, + "url": isURL, + "http_url": isHttpURL, + "uri": isURI, + "urn_rfc2141": isUrnRFC2141, // RFC 2141 + "file": isFile, + "filepath": isFilePath, + "base32": isBase32, + "base64": isBase64, + "base64url": isBase64URL, + "base64rawurl": isBase64RawURL, + "contains": contains, + "containsany": containsAny, + "containsrune": containsRune, + "excludes": excludes, + "excludesall": excludesAll, + "excludesrune": excludesRune, + "startswith": startsWith, + "endswith": endsWith, + "startsnotwith": startsNotWith, + "endsnotwith": endsNotWith, + "image": isImage, + "isbn": isISBN, + "isbn10": isISBN10, + "isbn13": isISBN13, + "issn": isISSN, + "eth_addr": isEthereumAddress, + "eth_addr_checksum": isEthereumAddressChecksum, + "btc_addr": isBitcoinAddress, + "btc_addr_bech32": isBitcoinBech32Address, + "uuid": isUUID, + "uuid3": isUUID3, + "uuid4": isUUID4, + "uuid5": isUUID5, + "uuid_rfc4122": isUUIDRFC4122, + "uuid3_rfc4122": isUUID3RFC4122, + "uuid4_rfc4122": isUUID4RFC4122, + "uuid5_rfc4122": isUUID5RFC4122, + "ulid": isULID, + "md4": isMD4, + "md5": isMD5, + "sha256": isSHA256, + "sha384": isSHA384, + "sha512": isSHA512, + "ripemd128": isRIPEMD128, + "ripemd160": isRIPEMD160, + "tiger128": isTIGER128, + "tiger160": isTIGER160, + "tiger192": isTIGER192, + "ascii": isASCII, + "printascii": isPrintableASCII, + "multibyte": hasMultiByteCharacter, + "datauri": isDataURI, + "latitude": isLatitude, + "longitude": isLongitude, + "ssn": isSSN, + "ipv4": isIPv4, + "ipv6": isIPv6, + "ip": isIP, + "cidrv4": isCIDRv4, + "cidrv6": isCIDRv6, + "cidr": isCIDR, + "tcp4_addr": isTCP4AddrResolvable, + "tcp6_addr": isTCP6AddrResolvable, + "tcp_addr": isTCPAddrResolvable, + "udp4_addr": isUDP4AddrResolvable, + "udp6_addr": isUDP6AddrResolvable, + "udp_addr": isUDPAddrResolvable, + "ip4_addr": isIP4AddrResolvable, + "ip6_addr": isIP6AddrResolvable, + "ip_addr": isIPAddrResolvable, + "unix_addr": isUnixAddrResolvable, + "mac": isMAC, + "hostname": isHostnameRFC952, // RFC 952 + "hostname_rfc1123": isHostnameRFC1123, // RFC 1123 + "fqdn": isFQDN, + "unique": isUnique, + "oneof": isOneOf, + "oneofci": isOneOfCI, + "html": isHTML, + "html_encoded": isHTMLEncoded, + "url_encoded": isURLEncoded, + "dir": isDir, + "dirpath": isDirPath, + "json": isJSON, + "jwt": isJWT, + "hostname_port": isHostnamePort, + "port": isPort, + "lowercase": isLowercase, + "uppercase": isUppercase, + "datetime": isDatetime, + "timezone": isTimeZone, + "iso3166_1_alpha2": isIso3166Alpha2, + "iso3166_1_alpha2_eu": isIso3166Alpha2EU, + "iso3166_1_alpha3": isIso3166Alpha3, + "iso3166_1_alpha3_eu": isIso3166Alpha3EU, + "iso3166_1_alpha_numeric": isIso3166AlphaNumeric, + "iso3166_1_alpha_numeric_eu": isIso3166AlphaNumericEU, + "iso3166_2": isIso31662, + "iso4217": isIso4217, + "iso4217_numeric": isIso4217Numeric, + "bcp47_language_tag": isBCP47LanguageTag, + "postcode_iso3166_alpha2": isPostcodeByIso3166Alpha2, + "postcode_iso3166_alpha2_field": isPostcodeByIso3166Alpha2Field, + "bic": isIsoBicFormat, + "semver": isSemverFormat, + "dns_rfc1035_label": isDnsRFC1035LabelFormat, + "credit_card": isCreditCard, + "cve": isCveFormat, + "luhn_checksum": hasLuhnChecksum, + "mongodb": isMongoDBObjectId, + "mongodb_connection_string": isMongoDBConnectionString, + "cron": isCron, + "spicedb": isSpiceDB, + } +) + +var ( + oneofValsCache = map[string][]string{} + oneofValsCacheRWLock = sync.RWMutex{} +) + +func parseOneOfParam2(s string) []string { + oneofValsCacheRWLock.RLock() + vals, ok := oneofValsCache[s] + oneofValsCacheRWLock.RUnlock() + if !ok { + oneofValsCacheRWLock.Lock() + vals = splitParamsRegex().FindAllString(s, -1) + for i := 0; i < len(vals); i++ { + vals[i] = strings.Replace(vals[i], "'", "", -1) + } + oneofValsCache[s] = vals + oneofValsCacheRWLock.Unlock() + } + return vals +} + +func isURLEncoded(fl FieldLevel) bool { + return uRLEncodedRegex().MatchString(fl.Field().String()) +} + +func isHTMLEncoded(fl FieldLevel) bool { + return hTMLEncodedRegex().MatchString(fl.Field().String()) +} + +func isHTML(fl FieldLevel) bool { + return hTMLRegex().MatchString(fl.Field().String()) +} + +func isOneOf(fl FieldLevel) bool { + vals := parseOneOfParam2(fl.Param()) + + field := fl.Field() + + var v string + switch field.Kind() { + case reflect.String: + v = field.String() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + v = strconv.FormatInt(field.Int(), 10) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + v = strconv.FormatUint(field.Uint(), 10) + default: + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } + for i := 0; i < len(vals); i++ { + if vals[i] == v { + return true + } + } + return false +} + +// isOneOfCI is the validation function for validating if the current field's value is one of the provided string values (case insensitive). +func isOneOfCI(fl FieldLevel) bool { + vals := parseOneOfParam2(fl.Param()) + field := fl.Field() + + if field.Kind() != reflect.String { + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } + v := field.String() + for _, val := range vals { + if strings.EqualFold(val, v) { + return true + } + } + return false +} + +// isUnique is the validation function for validating if each array|slice|map value is unique +func isUnique(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + v := reflect.ValueOf(struct{}{}) + + switch field.Kind() { + case reflect.Slice, reflect.Array: + elem := field.Type().Elem() + if elem.Kind() == reflect.Ptr { + elem = elem.Elem() + } + + if param == "" { + m := reflect.MakeMap(reflect.MapOf(elem, v.Type())) + + for i := 0; i < field.Len(); i++ { + m.SetMapIndex(reflect.Indirect(field.Index(i)), v) + } + return field.Len() == m.Len() + } + + sf, ok := elem.FieldByName(param) + if !ok { + panic(fmt.Sprintf("Bad field name %s", param)) + } + + sfTyp := sf.Type + if sfTyp.Kind() == reflect.Ptr { + sfTyp = sfTyp.Elem() + } + + m := reflect.MakeMap(reflect.MapOf(sfTyp, v.Type())) + var fieldlen int + for i := 0; i < field.Len(); i++ { + key := reflect.Indirect(reflect.Indirect(field.Index(i)).FieldByName(param)) + if key.IsValid() { + fieldlen++ + m.SetMapIndex(key, v) + } + } + return fieldlen == m.Len() + case reflect.Map: + var m reflect.Value + if field.Type().Elem().Kind() == reflect.Ptr { + m = reflect.MakeMap(reflect.MapOf(field.Type().Elem().Elem(), v.Type())) + } else { + m = reflect.MakeMap(reflect.MapOf(field.Type().Elem(), v.Type())) + } + + for _, k := range field.MapKeys() { + m.SetMapIndex(reflect.Indirect(field.MapIndex(k)), v) + } + + return field.Len() == m.Len() + default: + if parent := fl.Parent(); parent.Kind() == reflect.Struct { + uniqueField := parent.FieldByName(param) + if uniqueField == reflect.ValueOf(nil) { + panic(fmt.Sprintf("Bad field name provided %s", param)) + } + + if uniqueField.Kind() != field.Kind() { + panic(fmt.Sprintf("Bad field type %T:%T", field.Interface(), uniqueField.Interface())) + } + + return field.Interface() != uniqueField.Interface() + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } +} + +// isMAC is the validation function for validating if the field's value is a valid MAC address. +func isMAC(fl FieldLevel) bool { + _, err := net.ParseMAC(fl.Field().String()) + + return err == nil +} + +// isCIDRv4 is the validation function for validating if the field's value is a valid v4 CIDR address. +func isCIDRv4(fl FieldLevel) bool { + ip, net, err := net.ParseCIDR(fl.Field().String()) + + 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. +func isCIDRv6(fl FieldLevel) bool { + ip, _, err := net.ParseCIDR(fl.Field().String()) + + return err == nil && ip.To4() == nil +} + +// isCIDR is the validation function for validating if the field's value is a valid v4 or v6 CIDR address. +func isCIDR(fl FieldLevel) bool { + _, _, err := net.ParseCIDR(fl.Field().String()) + + return err == nil +} + +// isIPv4 is the validation function for validating if a value is a valid v4 IP address. +func isIPv4(fl FieldLevel) bool { + ip := net.ParseIP(fl.Field().String()) + + return ip != nil && ip.To4() != nil +} + +// isIPv6 is the validation function for validating if the field's value is a valid v6 IP address. +func isIPv6(fl FieldLevel) bool { + ip := net.ParseIP(fl.Field().String()) + + return ip != nil && ip.To4() == nil +} + +// isIP is the validation function for validating if the field's value is a valid v4 or v6 IP address. +func isIP(fl FieldLevel) bool { + ip := net.ParseIP(fl.Field().String()) + + return ip != nil +} + +// isSSN is the validation function for validating if the field's value is a valid SSN. +func isSSN(fl FieldLevel) bool { + field := fl.Field() + + if field.Len() != 11 { + return false + } + + return sSNRegex().MatchString(field.String()) +} + +// isLongitude is the validation function for validating if the field's value is a valid longitude coordinate. +func isLongitude(fl FieldLevel) bool { + field := fl.Field() + + var v string + switch field.Kind() { + case reflect.String: + v = field.String() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + v = strconv.FormatInt(field.Int(), 10) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + v = strconv.FormatUint(field.Uint(), 10) + case reflect.Float32: + v = strconv.FormatFloat(field.Float(), 'f', -1, 32) + case reflect.Float64: + v = strconv.FormatFloat(field.Float(), 'f', -1, 64) + default: + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } + + return longitudeRegex().MatchString(v) +} + +// isLatitude is the validation function for validating if the field's value is a valid latitude coordinate. +func isLatitude(fl FieldLevel) bool { + field := fl.Field() + + var v string + switch field.Kind() { + case reflect.String: + v = field.String() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + v = strconv.FormatInt(field.Int(), 10) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + v = strconv.FormatUint(field.Uint(), 10) + case reflect.Float32: + v = strconv.FormatFloat(field.Float(), 'f', -1, 32) + case reflect.Float64: + v = strconv.FormatFloat(field.Float(), 'f', -1, 64) + default: + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } + + return latitudeRegex().MatchString(v) +} + +// isDataURI is the validation function for validating if the field's value is a valid data URI. +func isDataURI(fl FieldLevel) bool { + uri := strings.SplitN(fl.Field().String(), ",", 2) + + if len(uri) != 2 { + return false + } + + if !dataURIRegex().MatchString(uri[0]) { + return false + } + + return base64Regex().MatchString(uri[1]) +} + +// hasMultiByteCharacter is the validation function for validating if the field's value has a multi byte character. +func hasMultiByteCharacter(fl FieldLevel) bool { + field := fl.Field() + + if field.Len() == 0 { + return true + } + + return multibyteRegex().MatchString(field.String()) +} + +// isPrintableASCII is the validation function for validating if the field's value is a valid printable ASCII character. +func isPrintableASCII(fl FieldLevel) bool { + return printableASCIIRegex().MatchString(fl.Field().String()) +} + +// isASCII is the validation function for validating if the field's value is a valid ASCII character. +func isASCII(fl FieldLevel) bool { + return aSCIIRegex().MatchString(fl.Field().String()) +} + +// isUUID5 is the validation function for validating if the field's value is a valid v5 UUID. +func isUUID5(fl FieldLevel) bool { + 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 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 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 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 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 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 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 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 fieldMatchesRegexByStringerValOrString(uLIDRegex, fl) +} + +// isMD4 is the validation function for validating if the field's value is a valid MD4. +func isMD4(fl FieldLevel) bool { + return md4Regex().MatchString(fl.Field().String()) +} + +// isMD5 is the validation function for validating if the field's value is a valid MD5. +func isMD5(fl FieldLevel) bool { + return md5Regex().MatchString(fl.Field().String()) +} + +// isSHA256 is the validation function for validating if the field's value is a valid SHA256. +func isSHA256(fl FieldLevel) bool { + return sha256Regex().MatchString(fl.Field().String()) +} + +// isSHA384 is the validation function for validating if the field's value is a valid SHA384. +func isSHA384(fl FieldLevel) bool { + return sha384Regex().MatchString(fl.Field().String()) +} + +// isSHA512 is the validation function for validating if the field's value is a valid SHA512. +func isSHA512(fl FieldLevel) bool { + return sha512Regex().MatchString(fl.Field().String()) +} + +// isRIPEMD128 is the validation function for validating if the field's value is a valid PIPEMD128. +func isRIPEMD128(fl FieldLevel) bool { + return ripemd128Regex().MatchString(fl.Field().String()) +} + +// isRIPEMD160 is the validation function for validating if the field's value is a valid PIPEMD160. +func isRIPEMD160(fl FieldLevel) bool { + return ripemd160Regex().MatchString(fl.Field().String()) +} + +// isTIGER128 is the validation function for validating if the field's value is a valid TIGER128. +func isTIGER128(fl FieldLevel) bool { + return tiger128Regex().MatchString(fl.Field().String()) +} + +// isTIGER160 is the validation function for validating if the field's value is a valid TIGER160. +func isTIGER160(fl FieldLevel) bool { + return tiger160Regex().MatchString(fl.Field().String()) +} + +// isTIGER192 is the validation function for validating if the field's value is a valid isTIGER192. +func isTIGER192(fl FieldLevel) bool { + return tiger192Regex().MatchString(fl.Field().String()) +} + +// isISBN is the validation function for validating if the field's value is a valid v10 or v13 ISBN. +func isISBN(fl FieldLevel) bool { + return isISBN10(fl) || isISBN13(fl) +} + +// isISBN13 is the validation function for validating if the field's value is a valid v13 ISBN. +func isISBN13(fl FieldLevel) bool { + s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 4), " ", "", 4) + + if !iSBN13Regex().MatchString(s) { + return false + } + + var checksum int32 + var i int32 + + factor := []int32{1, 3} + + for i = 0; i < 12; i++ { + checksum += factor[i%2] * int32(s[i]-'0') + } + + return (int32(s[12]-'0'))-((10-(checksum%10))%10) == 0 +} + +// isISBN10 is the validation function for validating if the field's value is a valid v10 ISBN. +func isISBN10(fl FieldLevel) bool { + s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 3), " ", "", 3) + + if !iSBN10Regex().MatchString(s) { + return false + } + + var checksum int32 + var i int32 + + for i = 0; i < 9; i++ { + checksum += (i + 1) * int32(s[i]-'0') + } + + if s[9] == 'X' { + checksum += 10 * 10 + } else { + checksum += 10 * int32(s[9]-'0') + } + + 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() + + return ethAddressRegex().MatchString(address) +} + +// isEthereumAddressChecksum is the validation function for validating if the field's value is a valid checksummed Ethereum address. +func isEthereumAddressChecksum(fl FieldLevel) bool { + address := fl.Field().String() + + if !ethAddressRegex().MatchString(address) { + return false + } + // Checksum validation. Reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md + address = address[2:] // Skip "0x" prefix. + h := sha3.NewLegacyKeccak256() + // hash.Hash's io.Writer implementation says it never returns an error. https://golang.org/pkg/hash/#Hash + _, _ = h.Write([]byte(strings.ToLower(address))) + hash := hex.EncodeToString(h.Sum(nil)) + + for i := 0; i < len(address); i++ { + if address[i] <= '9' { // Skip 0-9 digits: they don't have upper/lower-case. + continue + } + if hash[i] > '7' && address[i] >= 'a' || hash[i] <= '7' && address[i] <= 'F' { + return false + } + } + + return true +} + +// isBitcoinAddress is the validation function for validating if the field's value is a valid btc address +func isBitcoinAddress(fl FieldLevel) bool { + address := fl.Field().String() + + if !btcAddressRegex().MatchString(address) { + return false + } + + alphabet := []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") + + decode := [25]byte{} + + for _, n := range []byte(address) { + d := bytes.IndexByte(alphabet, n) + + for i := 24; i >= 0; i-- { + d += 58 * int(decode[i]) + decode[i] = byte(d % 256) + d /= 256 + } + } + + h := sha256.New() + _, _ = h.Write(decode[:21]) + d := h.Sum([]byte{}) + h = sha256.New() + _, _ = h.Write(d) + + validchecksum := [4]byte{} + computedchecksum := [4]byte{} + + copy(computedchecksum[:], h.Sum(d[:0])) + copy(validchecksum[:], decode[21:]) + + return validchecksum == computedchecksum +} + +// isBitcoinBech32Address is the validation function for validating if the field's value is a valid bech32 btc address +func isBitcoinBech32Address(fl FieldLevel) bool { + address := fl.Field().String() + + if !btcLowerAddressRegexBech32().MatchString(address) && !btcUpperAddressRegexBech32().MatchString(address) { + return false + } + + am := len(address) % 8 + + if am == 0 || am == 3 || am == 5 { + return false + } + + address = strings.ToLower(address) + + alphabet := "qpzry9x8gf2tvdw0s3jn54khce6mua7l" + + hr := []int{3, 3, 0, 2, 3} // the human readable part will always be bc + addr := address[3:] + dp := make([]int, 0, len(addr)) + + for _, c := range addr { + dp = append(dp, strings.IndexRune(alphabet, c)) + } + + ver := dp[0] + + if ver < 0 || ver > 16 { + return false + } + + if ver == 0 { + if len(address) != 42 && len(address) != 62 { + return false + } + } + + values := append(hr, dp...) + + GEN := []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3} + + p := 1 + + for _, v := range values { + b := p >> 25 + p = (p&0x1ffffff)<<5 ^ v + + for i := 0; i < 5; i++ { + if (b>>uint(i))&1 == 1 { + p ^= GEN[i] + } + } + } + + if p != 1 { + return false + } + + b := uint(0) + acc := 0 + mv := (1 << 5) - 1 + var sw []int + + for _, v := range dp[1 : len(dp)-6] { + acc = (acc << 5) | v + b += 5 + for b >= 8 { + b -= 8 + sw = append(sw, (acc>>b)&mv) + } + } + + if len(sw) < 2 || len(sw) > 40 { + return false + } + + return true +} + +// excludesRune is the validation function for validating that the field's value does not contain the rune specified within the param. +func excludesRune(fl FieldLevel) bool { + return !containsRune(fl) +} + +// excludesAll is the validation function for validating that the field's value does not contain any of the characters specified within the param. +func excludesAll(fl FieldLevel) bool { + return !containsAny(fl) +} + +// excludes is the validation function for validating that the field's value does not contain the text specified within the param. +func excludes(fl FieldLevel) bool { + return !contains(fl) +} + +// containsRune is the validation function for validating that the field's value contains the rune specified within the param. +func containsRune(fl FieldLevel) bool { + r, _ := utf8.DecodeRuneInString(fl.Param()) + + return strings.ContainsRune(fl.Field().String(), r) +} + +// containsAny is the validation function for validating that the field's value contains any of the characters specified within the param. +func containsAny(fl FieldLevel) bool { + return strings.ContainsAny(fl.Field().String(), fl.Param()) +} + +// contains is the validation function for validating that the field's value contains the text specified within the param. +func contains(fl FieldLevel) bool { + return strings.Contains(fl.Field().String(), fl.Param()) +} + +// startsWith is the validation function for validating that the field's value starts with the text specified within the param. +func startsWith(fl FieldLevel) bool { + return strings.HasPrefix(fl.Field().String(), fl.Param()) +} + +// endsWith is the validation function for validating that the field's value ends with the text specified within the param. +func endsWith(fl FieldLevel) bool { + return strings.HasSuffix(fl.Field().String(), fl.Param()) +} + +// startsNotWith is the validation function for validating that the field's value does not start with the text specified within the param. +func startsNotWith(fl FieldLevel) bool { + return !startsWith(fl) +} + +// endsNotWith is the validation function for validating that the field's value does not end with the text specified within the param. +func endsNotWith(fl FieldLevel) bool { + return !endsWith(fl) +} + +// fieldContains is the validation function for validating if the current field's value contains the field specified by the param's value. +func fieldContains(fl FieldLevel) bool { + field := fl.Field() + + currentField, _, ok := fl.GetStructFieldOK() + + if !ok { + return false + } + + return strings.Contains(field.String(), currentField.String()) +} + +// fieldExcludes is the validation function for validating if the current field's value excludes the field specified by the param's value. +func fieldExcludes(fl FieldLevel) bool { + field := fl.Field() + + currentField, _, ok := fl.GetStructFieldOK() + if !ok { + return true + } + + return !strings.Contains(field.String(), currentField.String()) +} + +// isNeField is the validation function for validating if the current field's value is not equal to the field specified by the param's value. +func isNeField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + currentField, currentKind, ok := fl.GetStructFieldOK() + + if !ok || currentKind != kind { + return true + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return field.Int() != currentField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return field.Uint() != currentField.Uint() + + case reflect.Float32, reflect.Float64: + return field.Float() != currentField.Float() + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(field.Len()) != int64(currentField.Len()) + + case reflect.Bool: + return field.Bool() != currentField.Bool() + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) { + + t := currentField.Interface().(time.Time) + fieldTime := field.Interface().(time.Time) + + return !fieldTime.Equal(t) + } + + // Not Same underlying type i.e. struct and time + if fieldType != currentField.Type() { + return true + } + } + + // default reflect.String: + return field.String() != currentField.String() +} + +// isNe is the validation function for validating that the field's value does not equal the provided param value. +func isNe(fl FieldLevel) bool { + return !isEq(fl) +} + +// isNeIgnoreCase is the validation function for validating that the field's string value does not equal the +// provided param value. The comparison is case-insensitive +func isNeIgnoreCase(fl FieldLevel) bool { + return !isEqIgnoreCase(fl) +} + +// isLteCrossStructField is the validation function for validating if the current field's value is less than or equal to the field, within a separate struct, specified by the param's value. +func isLteCrossStructField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + topField, topKind, ok := fl.GetStructFieldOK() + if !ok || topKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return field.Int() <= topField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return field.Uint() <= topField.Uint() + + case reflect.Float32, reflect.Float64: + return field.Float() <= topField.Float() + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(field.Len()) <= int64(topField.Len()) + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) { + + fieldTime := field.Convert(timeType).Interface().(time.Time) + topTime := topField.Convert(timeType).Interface().(time.Time) + + return fieldTime.Before(topTime) || fieldTime.Equal(topTime) + } + + // Not Same underlying type i.e. struct and time + if fieldType != topField.Type() { + return false + } + } + + // default reflect.String: + return field.String() <= topField.String() +} + +// isLtCrossStructField is the validation function for validating if the current field's value is less than the field, within a separate struct, specified by the param's value. +// NOTE: This is exposed for use within your own custom functions and not intended to be called directly. +func isLtCrossStructField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + topField, topKind, ok := fl.GetStructFieldOK() + if !ok || topKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return field.Int() < topField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return field.Uint() < topField.Uint() + + case reflect.Float32, reflect.Float64: + return field.Float() < topField.Float() + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(field.Len()) < int64(topField.Len()) + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) { + + fieldTime := field.Convert(timeType).Interface().(time.Time) + topTime := topField.Convert(timeType).Interface().(time.Time) + + return fieldTime.Before(topTime) + } + + // Not Same underlying type i.e. struct and time + if fieldType != topField.Type() { + return false + } + } + + // default reflect.String: + return field.String() < topField.String() +} + +// isGteCrossStructField is the validation function for validating if the current field's value is greater than or equal to the field, within a separate struct, specified by the param's value. +func isGteCrossStructField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + topField, topKind, ok := fl.GetStructFieldOK() + if !ok || topKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return field.Int() >= topField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return field.Uint() >= topField.Uint() + + case reflect.Float32, reflect.Float64: + return field.Float() >= topField.Float() + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(field.Len()) >= int64(topField.Len()) + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) { + + fieldTime := field.Convert(timeType).Interface().(time.Time) + topTime := topField.Convert(timeType).Interface().(time.Time) + + return fieldTime.After(topTime) || fieldTime.Equal(topTime) + } + + // Not Same underlying type i.e. struct and time + if fieldType != topField.Type() { + return false + } + } + + // default reflect.String: + return field.String() >= topField.String() +} + +// isGtCrossStructField is the validation function for validating if the current field's value is greater than the field, within a separate struct, specified by the param's value. +func isGtCrossStructField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + topField, topKind, ok := fl.GetStructFieldOK() + if !ok || topKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return field.Int() > topField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return field.Uint() > topField.Uint() + + case reflect.Float32, reflect.Float64: + return field.Float() > topField.Float() + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(field.Len()) > int64(topField.Len()) + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) { + + fieldTime := field.Convert(timeType).Interface().(time.Time) + topTime := topField.Convert(timeType).Interface().(time.Time) + + return fieldTime.After(topTime) + } + + // Not Same underlying type i.e. struct and time + if fieldType != topField.Type() { + return false + } + } + + // default reflect.String: + return field.String() > topField.String() +} + +// isNeCrossStructField is the validation function for validating that the current field's value is not equal to the field, within a separate struct, specified by the param's value. +func isNeCrossStructField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + topField, currentKind, ok := fl.GetStructFieldOK() + if !ok || currentKind != kind { + return true + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return topField.Int() != field.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return topField.Uint() != field.Uint() + + case reflect.Float32, reflect.Float64: + return topField.Float() != field.Float() + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(topField.Len()) != int64(field.Len()) + + case reflect.Bool: + return topField.Bool() != field.Bool() + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) { + + t := field.Convert(timeType).Interface().(time.Time) + fieldTime := topField.Convert(timeType).Interface().(time.Time) + + return !fieldTime.Equal(t) + } + + // Not Same underlying type i.e. struct and time + if fieldType != topField.Type() { + return true + } + } + + // default reflect.String: + return topField.String() != field.String() +} + +// isEqCrossStructField is the validation function for validating that the current field's value is equal to the field, within a separate struct, specified by the param's value. +func isEqCrossStructField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + topField, topKind, ok := fl.GetStructFieldOK() + if !ok || topKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return topField.Int() == field.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return topField.Uint() == field.Uint() + + case reflect.Float32, reflect.Float64: + return topField.Float() == field.Float() + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(topField.Len()) == int64(field.Len()) + + case reflect.Bool: + return topField.Bool() == field.Bool() + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) { + + t := field.Convert(timeType).Interface().(time.Time) + fieldTime := topField.Convert(timeType).Interface().(time.Time) + + return fieldTime.Equal(t) + } + + // Not Same underlying type i.e. struct and time + if fieldType != topField.Type() { + return false + } + } + + // default reflect.String: + return topField.String() == field.String() +} + +// isEqField is the validation function for validating if the current field's value is equal to the field specified by the param's value. +func isEqField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + currentField, currentKind, ok := fl.GetStructFieldOK() + if !ok || currentKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return field.Int() == currentField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return field.Uint() == currentField.Uint() + + case reflect.Float32, reflect.Float64: + return field.Float() == currentField.Float() + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(field.Len()) == int64(currentField.Len()) + + case reflect.Bool: + return field.Bool() == currentField.Bool() + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) { + + t := currentField.Convert(timeType).Interface().(time.Time) + fieldTime := field.Convert(timeType).Interface().(time.Time) + + return fieldTime.Equal(t) + } + + // Not Same underlying type i.e. struct and time + if fieldType != currentField.Type() { + return false + } + } + + // default reflect.String: + return field.String() == currentField.String() +} + +// isEq is the validation function for validating if the current field's value is equal to the param's value. +func isEq(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + switch field.Kind() { + + case reflect.String: + return field.String() == param + + case reflect.Slice, reflect.Map, reflect.Array: + p := asInt(param) + + return int64(field.Len()) == p + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p := asIntFromType(field.Type(), param) + + return field.Int() == p + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p := asUint(param) + + return field.Uint() == p + + case reflect.Float32: + p := asFloat32(param) + + return field.Float() == p + + case reflect.Float64: + p := asFloat64(param) + + return field.Float() == p + + case reflect.Bool: + p := asBool(param) + + return field.Bool() == p + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isEqIgnoreCase is the validation function for validating if the current field's string value is +// equal to the param's value. +// The comparison is case-insensitive. +func isEqIgnoreCase(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + switch field.Kind() { + + case reflect.String: + return strings.EqualFold(field.String(), param) + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isPostcodeByIso3166Alpha2 validates by value which is country code in iso 3166 alpha 2 +// example: `postcode_iso3166_alpha2=US` +func isPostcodeByIso3166Alpha2(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + postcodeRegexInit.Do(initPostcodes) + reg, found := postCodeRegexDict[param] + if !found { + return false + } + + return reg.MatchString(field.String()) +} + +// isPostcodeByIso3166Alpha2Field validates by field which represents for a value of country code in iso 3166 alpha 2 +// example: `postcode_iso3166_alpha2_field=CountryCode` +func isPostcodeByIso3166Alpha2Field(fl FieldLevel) bool { + field := fl.Field() + params := parseOneOfParam2(fl.Param()) + + if len(params) != 1 { + return false + } + + currentField, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), params[0]) + if !found { + return false + } + + if kind != reflect.String { + panic(fmt.Sprintf("Bad field type %T", currentField.Interface())) + } + + reg, found := postCodeRegexDict[currentField.String()] + if !found { + return false + } + + return reg.MatchString(field.String()) +} + +// isBase32 is the validation function for validating if the current field's value is a valid base 32. +func isBase32(fl FieldLevel) bool { + return base32Regex().MatchString(fl.Field().String()) +} + +// isBase64 is the validation function for validating if the current field's value is a valid base 64. +func isBase64(fl FieldLevel) bool { + return base64Regex().MatchString(fl.Field().String()) +} + +// isBase64URL is the validation function for validating if the current field's value is a valid base64 URL safe string. +func isBase64URL(fl FieldLevel) bool { + return base64URLRegex().MatchString(fl.Field().String()) +} + +// isBase64RawURL is the validation function for validating if the current field's value is a valid base64 URL safe string without '=' padding. +func isBase64RawURL(fl FieldLevel) bool { + return base64RawURLRegex().MatchString(fl.Field().String()) +} + +// isURI is the validation function for validating if the current field's value is a valid URI. +func isURI(fl FieldLevel) bool { + field := fl.Field() + + switch field.Kind() { + case reflect.String: + + s := field.String() + + // checks needed as of Go 1.6 because of change https://github.com/golang/go/commit/617c93ce740c3c3cc28cdd1a0d712be183d0b328#diff-6c2d018290e298803c0c9419d8739885L195 + // emulate browser and strip the '#' suffix prior to validation. see issue-#237 + if i := strings.Index(s, "#"); i > -1 { + s = s[:i] + } + + if len(s) == 0 { + return false + } + + _, err := url.ParseRequestURI(s) + + return err == nil + } + + 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() + + switch field.Kind() { + case reflect.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 + } + + if url.Host == "" && url.Fragment == "" && url.Opaque == "" { + return false + } + + return true + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isHttpURL is the validation function for validating if the current field's value is a valid HTTP(s) URL. +func isHttpURL(fl FieldLevel) bool { + if !isURL(fl) { + return false + } + + field := fl.Field() + switch field.Kind() { + case reflect.String: + + s := strings.ToLower(field.String()) + + url, err := url.Parse(s) + if err != nil || url.Host == "" { + return false + } + + return url.Scheme == "http" || url.Scheme == "https" + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isUrnRFC2141 is the validation function for validating if the current field's value is a valid URN as per RFC 2141. +func isUrnRFC2141(fl FieldLevel) bool { + field := fl.Field() + + switch field.Kind() { + case reflect.String: + + str := field.String() + + _, match := urn.Parse([]byte(str)) + + return match + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isFile is the validation function for validating if the current field's value is a valid existing file path. +func isFile(fl FieldLevel) bool { + field := fl.Field() + + switch field.Kind() { + case reflect.String: + fileInfo, err := os.Stat(field.String()) + if err != nil { + return false + } + + return !fileInfo.IsDir() + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isImage is the validation function for validating if the current field's value contains the path to a valid image file +func isImage(fl FieldLevel) bool { + mimetypes := map[string]bool{ + "image/bmp": true, + "image/cis-cod": true, + "image/gif": true, + "image/ief": true, + "image/jpeg": true, + "image/jp2": true, + "image/jpx": true, + "image/jpm": true, + "image/pipeg": true, + "image/png": true, + "image/svg+xml": true, + "image/tiff": true, + "image/webp": true, + "image/x-cmu-raster": true, + "image/x-cmx": true, + "image/x-icon": true, + "image/x-portable-anymap": true, + "image/x-portable-bitmap": true, + "image/x-portable-graymap": true, + "image/x-portable-pixmap": true, + "image/x-rgb": true, + "image/x-xbitmap": true, + "image/x-xpixmap": true, + "image/x-xwindowdump": true, + } + field := fl.Field() + + switch field.Kind() { + case reflect.String: + filePath := field.String() + fileInfo, err := os.Stat(filePath) + + if err != nil { + return false + } + + if fileInfo.IsDir() { + return false + } + + file, err := os.Open(filePath) + if err != nil { + return false + } + defer file.Close() + + mime, err := mimetype.DetectReader(file) + if err != nil { + return false + } + + if _, ok := mimetypes[mime.String()]; ok { + return true + } + } + return false +} + +// isFilePath is the validation function for validating if the current field's value is a valid file path. +func isFilePath(fl FieldLevel) bool { + + var exists bool + var err error + + field := fl.Field() + + // Not valid if it is a directory. + if isDir(fl) { + return false + } + // If it exists, it obviously is valid. + // This is done first to avoid code duplication and unnecessary additional logic. + if exists = isFile(fl); exists { + return true + } + + // It does not exist but may still be a valid filepath. + switch field.Kind() { + case reflect.String: + // Every OS allows for whitespace, but none + // let you use a file with no filename (to my knowledge). + // Unless you're dealing with raw inodes, but I digress. + if strings.TrimSpace(field.String()) == "" { + return false + } + // We make sure it isn't a directory. + if strings.HasSuffix(field.String(), string(os.PathSeparator)) { + return false + } + if _, err = os.Stat(field.String()); err != nil { + switch t := err.(type) { + case *fs.PathError: + if t.Err == syscall.EINVAL { + // It's definitely an invalid character in the filepath. + return false + } + // It could be a permission error, a does-not-exist error, etc. + // Out-of-scope for this validation, though. + return true + default: + // Something went *seriously* wrong. + /* + Per https://pkg.go.dev/os#Stat: + "If there is an error, it will be of type *PathError." + */ + panic(err) + } + } + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number. +func isE164(fl FieldLevel) bool { + return e164Regex().MatchString(fl.Field().String()) +} + +// isEmail is the validation function for validating if the current field's value is a valid email address. +func isEmail(fl FieldLevel) bool { + return emailRegex().MatchString(fl.Field().String()) +} + +// isHSLA is the validation function for validating if the current field's value is a valid HSLA color. +func isHSLA(fl FieldLevel) bool { + return hslaRegex().MatchString(fl.Field().String()) +} + +// isHSL is the validation function for validating if the current field's value is a valid HSL color. +func isHSL(fl FieldLevel) bool { + return hslRegex().MatchString(fl.Field().String()) +} + +// isRGBA is the validation function for validating if the current field's value is a valid RGBA color. +func isRGBA(fl FieldLevel) bool { + return rgbaRegex().MatchString(fl.Field().String()) +} + +// isRGB is the validation function for validating if the current field's value is a valid RGB color. +func isRGB(fl FieldLevel) bool { + return rgbRegex().MatchString(fl.Field().String()) +} + +// isHEXColor is the validation function for validating if the current field's value is a valid HEX color. +func isHEXColor(fl FieldLevel) bool { + return hexColorRegex().MatchString(fl.Field().String()) +} + +// isHexadecimal is the validation function for validating if the current field's value is a valid hexadecimal. +func isHexadecimal(fl FieldLevel) bool { + return hexadecimalRegex().MatchString(fl.Field().String()) +} + +// isNumber is the validation function for validating if the current field's value is a valid number. +func isNumber(fl FieldLevel) bool { + switch fl.Field().Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64: + return true + default: + return numberRegex().MatchString(fl.Field().String()) + } +} + +// isNumeric is the validation function for validating if the current field's value is a valid numeric value. +func isNumeric(fl FieldLevel) bool { + switch fl.Field().Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64: + return true + default: + return numericRegex().MatchString(fl.Field().String()) + } +} + +// isAlphanum is the validation function for validating if the current field's value is a valid alphanumeric value. +func isAlphanum(fl FieldLevel) bool { + return alphaNumericRegex().MatchString(fl.Field().String()) +} + +// isAlpha is the validation function for validating if the current field's value is a valid alpha value. +func isAlpha(fl FieldLevel) bool { + return alphaRegex().MatchString(fl.Field().String()) +} + +// isAlphanumUnicode is the validation function for validating if the current field's value is a valid alphanumeric unicode value. +func isAlphanumUnicode(fl FieldLevel) bool { + return alphaUnicodeNumericRegex().MatchString(fl.Field().String()) +} + +// isAlphaUnicode is the validation function for validating if the current field's value is a valid alpha unicode value. +func isAlphaUnicode(fl FieldLevel) bool { + return alphaUnicodeRegex().MatchString(fl.Field().String()) +} + +// isBoolean is the validation function for validating if the current field's value is a valid boolean value or can be safely converted to a boolean value. +func isBoolean(fl FieldLevel) bool { + switch fl.Field().Kind() { + case reflect.Bool: + return true + default: + _, err := strconv.ParseBool(fl.Field().String()) + return err == nil + } +} + +// isDefault is the opposite of required aka hasValue +func isDefault(fl FieldLevel) bool { + return !hasValue(fl) +} + +// hasValue is the validation function for validating if the current field's value is not the default static value. +func hasValue(fl FieldLevel) bool { + field := fl.Field() + switch field.Kind() { + case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func: + return !field.IsNil() + default: + if fl.(*validate).fldIsPointer && field.Interface() != nil { + return true + } + return field.IsValid() && !field.IsZero() + } +} + +// requireCheckFieldKind is a func for check field kind +func requireCheckFieldKind(fl FieldLevel, param string, defaultNotFoundValue bool) bool { + field := fl.Field() + kind := field.Kind() + var nullable, found bool + if len(param) > 0 { + field, kind, nullable, found = fl.GetStructFieldOKAdvanced2(fl.Parent(), param) + if !found { + return defaultNotFoundValue + } + } + switch kind { + case reflect.Invalid: + return defaultNotFoundValue + case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func: + return field.IsNil() + default: + if nullable && field.Interface() != nil { + return false + } + return field.IsValid() && field.IsZero() + } +} + +// requireCheckFieldValue is a func for check field value +func requireCheckFieldValue( + fl FieldLevel, param string, value string, defaultNotFoundValue bool, +) bool { + field, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), param) + if !found { + return defaultNotFoundValue + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return field.Int() == asInt(value) + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return field.Uint() == asUint(value) + + case reflect.Float32: + return field.Float() == asFloat32(value) + + case reflect.Float64: + return field.Float() == asFloat64(value) + + case reflect.Slice, reflect.Map, reflect.Array: + return int64(field.Len()) == asInt(value) + + case reflect.Bool: + return field.Bool() == (value == "true") + + case reflect.Ptr: + if field.IsNil() { + return value == "nil" + } + // Handle non-nil pointers + return requireCheckFieldValue(fl, param, value, defaultNotFoundValue) + } + + // default reflect.String: + return field.String() == value +} + +// requiredIf is the validation function +// The field under validation must be present and not empty only if all the other specified fields are equal to the value following with the specified field. +func requiredIf(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + if len(params)%2 != 0 { + panic(fmt.Sprintf("Bad param number for required_if %s", fl.FieldName())) + } + for i := 0; i < len(params); i += 2 { + if !requireCheckFieldValue(fl, params[i], params[i+1], false) { + return true + } + } + return hasValue(fl) +} + +// excludedIf is the validation function +// The field under validation must not be present or is empty only if all the other specified fields are equal to the value following with the specified field. +func excludedIf(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + if len(params)%2 != 0 { + panic(fmt.Sprintf("Bad param number for excluded_if %s", fl.FieldName())) + } + + for i := 0; i < len(params); i += 2 { + if !requireCheckFieldValue(fl, params[i], params[i+1], false) { + return true + } + } + return !hasValue(fl) +} + +// requiredUnless is the validation function +// The field under validation must be present and not empty only unless all the other specified fields are equal to the value following with the specified field. +func requiredUnless(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + if len(params)%2 != 0 { + panic(fmt.Sprintf("Bad param number for required_unless %s", fl.FieldName())) + } + + for i := 0; i < len(params); i += 2 { + if requireCheckFieldValue(fl, params[i], params[i+1], false) { + return true + } + } + return hasValue(fl) +} + +// skipUnless is the validation function +// The field under validation must be present and not empty only unless all the other specified fields are equal to the value following with the specified field. +func skipUnless(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + if len(params)%2 != 0 { + panic(fmt.Sprintf("Bad param number for skip_unless %s", fl.FieldName())) + } + for i := 0; i < len(params); i += 2 { + if !requireCheckFieldValue(fl, params[i], params[i+1], false) { + return true + } + } + return hasValue(fl) +} + +// excludedUnless is the validation function +// The field under validation must not be present or is empty unless all the other specified fields are equal to the value following with the specified field. +func excludedUnless(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + if len(params)%2 != 0 { + panic(fmt.Sprintf("Bad param number for excluded_unless %s", fl.FieldName())) + } + for i := 0; i < len(params); i += 2 { + if !requireCheckFieldValue(fl, params[i], params[i+1], false) { + return !hasValue(fl) + } + } + return true +} + +// excludedWith is the validation function +// The field under validation must not be present or is empty if any of the other specified fields are present. +func excludedWith(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + for _, param := range params { + if !requireCheckFieldKind(fl, param, true) { + return !hasValue(fl) + } + } + return true +} + +// requiredWith is the validation function +// The field under validation must be present and not empty only if any of the other specified fields are present. +func requiredWith(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + for _, param := range params { + if !requireCheckFieldKind(fl, param, true) { + return hasValue(fl) + } + } + return true +} + +// excludedWithAll is the validation function +// The field under validation must not be present or is empty if all of the other specified fields are present. +func excludedWithAll(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + for _, param := range params { + if requireCheckFieldKind(fl, param, true) { + return true + } + } + return !hasValue(fl) +} + +// requiredWithAll is the validation function +// The field under validation must be present and not empty only if all of the other specified fields are present. +func requiredWithAll(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + for _, param := range params { + if requireCheckFieldKind(fl, param, true) { + return true + } + } + return hasValue(fl) +} + +// excludedWithout is the validation function +// The field under validation must not be present or is empty when any of the other specified fields are not present. +func excludedWithout(fl FieldLevel) bool { + if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) { + return !hasValue(fl) + } + return true +} + +// requiredWithout is the validation function +// The field under validation must be present and not empty only when any of the other specified fields are not present. +func requiredWithout(fl FieldLevel) bool { + if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) { + return hasValue(fl) + } + return true +} + +// excludedWithoutAll is the validation function +// The field under validation must not be present or is empty when all of the other specified fields are not present. +func excludedWithoutAll(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + for _, param := range params { + if !requireCheckFieldKind(fl, param, true) { + return true + } + } + return !hasValue(fl) +} + +// requiredWithoutAll is the validation function +// The field under validation must be present and not empty only when all of the other specified fields are not present. +func requiredWithoutAll(fl FieldLevel) bool { + params := parseOneOfParam2(fl.Param()) + for _, param := range params { + if !requireCheckFieldKind(fl, param, true) { + return true + } + } + return hasValue(fl) +} + +// isGteField is the validation function for validating if the current field's value is greater than or equal to the field specified by the param's value. +func isGteField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + currentField, currentKind, ok := fl.GetStructFieldOK() + if !ok || currentKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + + return field.Int() >= currentField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + + return field.Uint() >= currentField.Uint() + + case reflect.Float32, reflect.Float64: + + return field.Float() >= currentField.Float() + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) { + + t := currentField.Convert(timeType).Interface().(time.Time) + fieldTime := field.Convert(timeType).Interface().(time.Time) + + return fieldTime.After(t) || fieldTime.Equal(t) + } + + // Not Same underlying type i.e. struct and time + if fieldType != currentField.Type() { + return false + } + } + + // default reflect.String + return len(field.String()) >= len(currentField.String()) +} + +// isGtField is the validation function for validating if the current field's value is greater than the field specified by the param's value. +func isGtField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + currentField, currentKind, ok := fl.GetStructFieldOK() + if !ok || currentKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + + return field.Int() > currentField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + + return field.Uint() > currentField.Uint() + + case reflect.Float32, reflect.Float64: + + return field.Float() > currentField.Float() + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) { + + t := currentField.Convert(timeType).Interface().(time.Time) + fieldTime := field.Convert(timeType).Interface().(time.Time) + + return fieldTime.After(t) + } + + // Not Same underlying type i.e. struct and time + if fieldType != currentField.Type() { + return false + } + } + + // default reflect.String + return len(field.String()) > len(currentField.String()) +} + +// isGte is the validation function for validating if the current field's value is greater than or equal to the param's value. +func isGte(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + switch field.Kind() { + + case reflect.String: + p := asInt(param) + + return int64(utf8.RuneCountInString(field.String())) >= p + + case reflect.Slice, reflect.Map, reflect.Array: + p := asInt(param) + + return int64(field.Len()) >= p + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p := asIntFromType(field.Type(), param) + + return field.Int() >= p + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p := asUint(param) + + return field.Uint() >= p + + case reflect.Float32: + p := asFloat32(param) + + return field.Float() >= p + + case reflect.Float64: + p := asFloat64(param) + + return field.Float() >= p + + case reflect.Struct: + + if field.Type().ConvertibleTo(timeType) { + + now := time.Now().UTC() + t := field.Convert(timeType).Interface().(time.Time) + + return t.After(now) || t.Equal(now) + } + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isGt is the validation function for validating if the current field's value is greater than the param's value. +func isGt(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + switch field.Kind() { + + case reflect.String: + p := asInt(param) + + return int64(utf8.RuneCountInString(field.String())) > p + + case reflect.Slice, reflect.Map, reflect.Array: + p := asInt(param) + + return int64(field.Len()) > p + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p := asIntFromType(field.Type(), param) + + return field.Int() > p + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p := asUint(param) + + return field.Uint() > p + + case reflect.Float32: + p := asFloat32(param) + + return field.Float() > p + + case reflect.Float64: + p := asFloat64(param) + + return field.Float() > p + + case reflect.Struct: + + if field.Type().ConvertibleTo(timeType) { + + return field.Convert(timeType).Interface().(time.Time).After(time.Now().UTC()) + } + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// hasLengthOf is the validation function for validating if the current field's value is equal to the param's value. +func hasLengthOf(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + switch field.Kind() { + + case reflect.String: + p := asInt(param) + + return int64(utf8.RuneCountInString(field.String())) == p + + case reflect.Slice, reflect.Map, reflect.Array: + p := asInt(param) + + return int64(field.Len()) == p + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p := asIntFromType(field.Type(), param) + + return field.Int() == p + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p := asUint(param) + + return field.Uint() == p + + case reflect.Float32: + p := asFloat32(param) + + return field.Float() == p + + case reflect.Float64: + p := asFloat64(param) + + return field.Float() == p + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// hasMinOf is the validation function for validating if the current field's value is greater than or equal to the param's value. +func hasMinOf(fl FieldLevel) bool { + return isGte(fl) +} + +// isLteField is the validation function for validating if the current field's value is less than or equal to the field specified by the param's value. +func isLteField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + currentField, currentKind, ok := fl.GetStructFieldOK() + if !ok || currentKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + + return field.Int() <= currentField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + + return field.Uint() <= currentField.Uint() + + case reflect.Float32, reflect.Float64: + + return field.Float() <= currentField.Float() + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) { + + t := currentField.Convert(timeType).Interface().(time.Time) + fieldTime := field.Convert(timeType).Interface().(time.Time) + + return fieldTime.Before(t) || fieldTime.Equal(t) + } + + // Not Same underlying type i.e. struct and time + if fieldType != currentField.Type() { + return false + } + } + + // default reflect.String + return len(field.String()) <= len(currentField.String()) +} + +// isLtField is the validation function for validating if the current field's value is less than the field specified by the param's value. +func isLtField(fl FieldLevel) bool { + field := fl.Field() + kind := field.Kind() + + currentField, currentKind, ok := fl.GetStructFieldOK() + if !ok || currentKind != kind { + return false + } + + switch kind { + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + + return field.Int() < currentField.Int() + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + + return field.Uint() < currentField.Uint() + + case reflect.Float32, reflect.Float64: + + return field.Float() < currentField.Float() + + case reflect.Struct: + + fieldType := field.Type() + + if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) { + + t := currentField.Convert(timeType).Interface().(time.Time) + fieldTime := field.Convert(timeType).Interface().(time.Time) + + return fieldTime.Before(t) + } + + // Not Same underlying type i.e. struct and time + if fieldType != currentField.Type() { + return false + } + } + + // default reflect.String + return len(field.String()) < len(currentField.String()) +} + +// isLte is the validation function for validating if the current field's value is less than or equal to the param's value. +func isLte(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + switch field.Kind() { + + case reflect.String: + p := asInt(param) + + return int64(utf8.RuneCountInString(field.String())) <= p + + case reflect.Slice, reflect.Map, reflect.Array: + p := asInt(param) + + return int64(field.Len()) <= p + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p := asIntFromType(field.Type(), param) + + return field.Int() <= p + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p := asUint(param) + + return field.Uint() <= p + + case reflect.Float32: + p := asFloat32(param) + + return field.Float() <= p + + case reflect.Float64: + p := asFloat64(param) + + return field.Float() <= p + + case reflect.Struct: + + if field.Type().ConvertibleTo(timeType) { + + now := time.Now().UTC() + t := field.Convert(timeType).Interface().(time.Time) + + return t.Before(now) || t.Equal(now) + } + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isLt is the validation function for validating if the current field's value is less than the param's value. +func isLt(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + switch field.Kind() { + + case reflect.String: + p := asInt(param) + + return int64(utf8.RuneCountInString(field.String())) < p + + case reflect.Slice, reflect.Map, reflect.Array: + p := asInt(param) + + return int64(field.Len()) < p + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p := asIntFromType(field.Type(), param) + + return field.Int() < p + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p := asUint(param) + + return field.Uint() < p + + case reflect.Float32: + p := asFloat32(param) + + return field.Float() < p + + case reflect.Float64: + p := asFloat64(param) + + return field.Float() < p + + case reflect.Struct: + + if field.Type().ConvertibleTo(timeType) { + + return field.Convert(timeType).Interface().(time.Time).Before(time.Now().UTC()) + } + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// hasMaxOf is the validation function for validating if the current field's value is less than or equal to the param's value. +func hasMaxOf(fl FieldLevel) bool { + return isLte(fl) +} + +// isTCP4AddrResolvable is the validation function for validating if the field's value is a resolvable tcp4 address. +func isTCP4AddrResolvable(fl FieldLevel) bool { + if !isIP4Addr(fl) { + return false + } + + _, err := net.ResolveTCPAddr("tcp4", fl.Field().String()) + return err == nil +} + +// isTCP6AddrResolvable is the validation function for validating if the field's value is a resolvable tcp6 address. +func isTCP6AddrResolvable(fl FieldLevel) bool { + if !isIP6Addr(fl) { + return false + } + + _, err := net.ResolveTCPAddr("tcp6", fl.Field().String()) + + return err == nil +} + +// isTCPAddrResolvable is the validation function for validating if the field's value is a resolvable tcp address. +func isTCPAddrResolvable(fl FieldLevel) bool { + if !isIP4Addr(fl) && !isIP6Addr(fl) { + return false + } + + _, err := net.ResolveTCPAddr("tcp", fl.Field().String()) + + return err == nil +} + +// isUDP4AddrResolvable is the validation function for validating if the field's value is a resolvable udp4 address. +func isUDP4AddrResolvable(fl FieldLevel) bool { + if !isIP4Addr(fl) { + return false + } + + _, err := net.ResolveUDPAddr("udp4", fl.Field().String()) + + return err == nil +} + +// isUDP6AddrResolvable is the validation function for validating if the field's value is a resolvable udp6 address. +func isUDP6AddrResolvable(fl FieldLevel) bool { + if !isIP6Addr(fl) { + return false + } + + _, err := net.ResolveUDPAddr("udp6", fl.Field().String()) + + return err == nil +} + +// isUDPAddrResolvable is the validation function for validating if the field's value is a resolvable udp address. +func isUDPAddrResolvable(fl FieldLevel) bool { + if !isIP4Addr(fl) && !isIP6Addr(fl) { + return false + } + + _, err := net.ResolveUDPAddr("udp", fl.Field().String()) + + return err == nil +} + +// isIP4AddrResolvable is the validation function for validating if the field's value is a resolvable ip4 address. +func isIP4AddrResolvable(fl FieldLevel) bool { + if !isIPv4(fl) { + return false + } + + _, err := net.ResolveIPAddr("ip4", fl.Field().String()) + + return err == nil +} + +// isIP6AddrResolvable is the validation function for validating if the field's value is a resolvable ip6 address. +func isIP6AddrResolvable(fl FieldLevel) bool { + if !isIPv6(fl) { + return false + } + + _, err := net.ResolveIPAddr("ip6", fl.Field().String()) + + return err == nil +} + +// isIPAddrResolvable is the validation function for validating if the field's value is a resolvable ip address. +func isIPAddrResolvable(fl FieldLevel) bool { + if !isIP(fl) { + return false + } + + _, err := net.ResolveIPAddr("ip", fl.Field().String()) + + return err == nil +} + +// isUnixAddrResolvable is the validation function for validating if the field's value is a resolvable unix address. +func isUnixAddrResolvable(fl FieldLevel) bool { + _, err := net.ResolveUnixAddr("unix", fl.Field().String()) + + return err == nil +} + +func isIP4Addr(fl FieldLevel) bool { + val := fl.Field().String() + + if idx := strings.LastIndex(val, ":"); idx != -1 { + val = val[0:idx] + } + + ip := net.ParseIP(val) + + return ip != nil && ip.To4() != nil +} + +func isIP6Addr(fl FieldLevel) bool { + val := fl.Field().String() + + if idx := strings.LastIndex(val, ":"); idx != -1 { + if idx != 0 && val[idx-1:idx] == "]" { + val = val[1 : idx-1] + } + } + + ip := net.ParseIP(val) + + return ip != nil && ip.To4() == nil +} + +func isHostnameRFC952(fl FieldLevel) bool { + return hostnameRegexRFC952().MatchString(fl.Field().String()) +} + +func isHostnameRFC1123(fl FieldLevel) bool { + return hostnameRegexRFC1123().MatchString(fl.Field().String()) +} + +func isFQDN(fl FieldLevel) bool { + val := fl.Field().String() + + if val == "" { + return false + } + + return fqdnRegexRFC1123().MatchString(val) +} + +// isDir is the validation function for validating if the current field's value is a valid existing directory. +func isDir(fl FieldLevel) bool { + field := fl.Field() + + if field.Kind() == reflect.String { + fileInfo, err := os.Stat(field.String()) + if err != nil { + return false + } + + return fileInfo.IsDir() + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isDirPath is the validation function for validating if the current field's value is a valid directory. +func isDirPath(fl FieldLevel) bool { + + var exists bool + var err error + + field := fl.Field() + + // If it exists, it obviously is valid. + // This is done first to avoid code duplication and unnecessary additional logic. + if exists = isDir(fl); exists { + return true + } + + // It does not exist but may still be a valid path. + switch field.Kind() { + case reflect.String: + // Every OS allows for whitespace, but none + // let you use a dir with no name (to my knowledge). + // Unless you're dealing with raw inodes, but I digress. + if strings.TrimSpace(field.String()) == "" { + return false + } + if _, err = os.Stat(field.String()); err != nil { + switch t := err.(type) { + case *fs.PathError: + if t.Err == syscall.EINVAL { + // It's definitely an invalid character in the path. + return false + } + // It could be a permission error, a does-not-exist error, etc. + // Out-of-scope for this validation, though. + // Lastly, we make sure it is a directory. + if strings.HasSuffix(field.String(), string(os.PathSeparator)) { + return true + } else { + return false + } + default: + // Something went *seriously* wrong. + /* + Per https://pkg.go.dev/os#Stat: + "If there is an error, it will be of type *PathError." + */ + panic(err) + } + } + // We repeat the check here to make sure it is an explicit directory in case the above os.Stat didn't trigger an error. + if strings.HasSuffix(field.String(), string(os.PathSeparator)) { + return true + } else { + return false + } + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isJSON is the validation function for validating if the current field's value is a valid json string. +func isJSON(fl FieldLevel) bool { + field := fl.Field() + + switch field.Kind() { + case reflect.String: + val := field.String() + return json.Valid([]byte(val)) + case reflect.Slice: + fieldType := field.Type() + + if fieldType.ConvertibleTo(byteSliceType) { + b := field.Convert(byteSliceType).Interface().([]byte) + return json.Valid(b) + } + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isJWT is the validation function for validating if the current field's value is a valid JWT string. +func isJWT(fl FieldLevel) bool { + return jWTRegex().MatchString(fl.Field().String()) +} + +// isHostnamePort validates a : combination for fields typically used for socket address. +func isHostnamePort(fl FieldLevel) bool { + val := fl.Field().String() + host, port, err := net.SplitHostPort(val) + if err != nil { + return false + } + // Port must be a iny <= 65535. + if portNum, err := strconv.ParseInt( + port, 10, 32, + ); err != nil || portNum > 65535 || portNum < 1 { + return false + } + + // If host is specified, it should match a DNS name + if host != "" { + return hostnameRegexRFC1123().MatchString(host) + } + return true +} + +// IsPort validates if the current field's value represents a valid port +func isPort(fl FieldLevel) bool { + val := fl.Field().Uint() + + return val >= 1 && val <= 65535 +} + +// isLowercase is the validation function for validating if the current field's value is a lowercase string. +func isLowercase(fl FieldLevel) bool { + field := fl.Field() + + if field.Kind() == reflect.String { + if field.String() == "" { + return false + } + return field.String() == strings.ToLower(field.String()) + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isUppercase is the validation function for validating if the current field's value is an uppercase string. +func isUppercase(fl FieldLevel) bool { + field := fl.Field() + + if field.Kind() == reflect.String { + if field.String() == "" { + return false + } + return field.String() == strings.ToUpper(field.String()) + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isDatetime is the validation function for validating if the current field's value is a valid datetime string. +func isDatetime(fl FieldLevel) bool { + field := fl.Field() + param := fl.Param() + + if field.Kind() == reflect.String { + _, err := time.Parse(param, field.String()) + + return err == nil + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isTimeZone is the validation function for validating if the current field's value is a valid time zone string. +func isTimeZone(fl FieldLevel) bool { + field := fl.Field() + + if field.Kind() == reflect.String { + // empty value is converted to UTC by time.LoadLocation but disallow it as it is not a valid time zone name + if field.String() == "" { + return false + } + + // Local value is converted to the current system time zone by time.LoadLocation but disallow it as it is not a valid time zone name + if strings.ToLower(field.String()) == "local" { + return false + } + + _, err := time.LoadLocation(field.String()) + return err == nil + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isIso3166Alpha2 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-2 country code. +func isIso3166Alpha2(fl FieldLevel) bool { + _, ok := iso3166_1_alpha2[fl.Field().String()] + return ok +} + +// isIso3166Alpha2EU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-2 European Union country code. +func isIso3166Alpha2EU(fl FieldLevel) bool { + _, ok := iso3166_1_alpha2_eu[fl.Field().String()] + return ok +} + +// isIso3166Alpha3 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-3 country code. +func isIso3166Alpha3(fl FieldLevel) bool { + _, ok := iso3166_1_alpha3[fl.Field().String()] + return ok +} + +// isIso3166Alpha3EU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-3 European Union country code. +func isIso3166Alpha3EU(fl FieldLevel) bool { + _, ok := iso3166_1_alpha3_eu[fl.Field().String()] + return ok +} + +// isIso3166AlphaNumeric is the validation function for validating if the current field's value is a valid iso3166-1 alpha-numeric country code. +func isIso3166AlphaNumeric(fl FieldLevel) bool { + field := fl.Field() + + var code int + switch field.Kind() { + case reflect.String: + i, err := strconv.Atoi(field.String()) + if err != nil { + return false + } + code = i % 1000 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + code = int(field.Int() % 1000) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + code = int(field.Uint() % 1000) + default: + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } + + _, ok := iso3166_1_alpha_numeric[code] + return ok +} + +// isIso3166AlphaNumericEU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-numeric European Union country code. +func isIso3166AlphaNumericEU(fl FieldLevel) bool { + field := fl.Field() + + var code int + switch field.Kind() { + case reflect.String: + i, err := strconv.Atoi(field.String()) + if err != nil { + return false + } + code = i % 1000 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + code = int(field.Int() % 1000) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + code = int(field.Uint() % 1000) + default: + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } + + _, ok := iso3166_1_alpha_numeric_eu[code] + return ok +} + +// isIso31662 is the validation function for validating if the current field's value is a valid iso3166-2 code. +func isIso31662(fl FieldLevel) bool { + _, ok := iso3166_2[fl.Field().String()] + return ok +} + +// isIso4217 is the validation function for validating if the current field's value is a valid iso4217 currency code. +func isIso4217(fl FieldLevel) bool { + _, ok := iso4217[fl.Field().String()] + return ok +} + +// isIso4217Numeric is the validation function for validating if the current field's value is a valid iso4217 numeric currency code. +func isIso4217Numeric(fl FieldLevel) bool { + field := fl.Field() + + var code int + switch field.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + code = int(field.Int()) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + code = int(field.Uint()) + default: + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } + + _, ok := iso4217_numeric[code] + return ok +} + +// isBCP47LanguageTag is the validation function for validating if the current field's value is a valid BCP 47 language tag, as parsed by language.Parse +func isBCP47LanguageTag(fl FieldLevel) bool { + field := fl.Field() + + if field.Kind() == reflect.String { + _, err := language.Parse(field.String()) + return err == nil + } + + panic(fmt.Sprintf("Bad field type %T", field.Interface())) +} + +// isIsoBicFormat is the validation function for validating if the current field's value is a valid Business Identifier Code (SWIFT code), defined in ISO 9362 +func isIsoBicFormat(fl FieldLevel) bool { + bicString := fl.Field().String() + + return bicRegex().MatchString(bicString) +} + +// isSemverFormat is the validation function for validating if the current field's value is a valid semver version, defined in Semantic Versioning 2.0.0 +func isSemverFormat(fl FieldLevel) bool { + semverString := fl.Field().String() + + return semverRegex().MatchString(semverString) +} + +// isCveFormat is the validation function for validating if the current field's value is a valid cve id, defined in CVE mitre org +func isCveFormat(fl FieldLevel) bool { + cveString := fl.Field().String() + + return cveRegex().MatchString(cveString) +} + +// isDnsRFC1035LabelFormat is the validation function +// for validating if the current field's value is +// a valid dns RFC 1035 label, defined in RFC 1035. +func isDnsRFC1035LabelFormat(fl FieldLevel) bool { + val := fl.Field().String() + return dnsRegexRFC1035Label().MatchString(val) +} + +// digitsHaveLuhnChecksum returns true if and only if the last element of the given digits slice is the Luhn checksum of the previous elements +func digitsHaveLuhnChecksum(digits []string) bool { + size := len(digits) + sum := 0 + for i, digit := range digits { + value, err := strconv.Atoi(digit) + if err != nil { + return false + } + if size%2 == 0 && i%2 == 0 || size%2 == 1 && i%2 == 1 { + v := value * 2 + if v >= 10 { + sum += 1 + (v % 10) + } else { + sum += v + } + } else { + sum += value + } + } + return (sum % 10) == 0 +} + +// isMongoDBObjectId is the validation function for validating if the current field's value is valid MongoDB ObjectID +func isMongoDBObjectId(fl FieldLevel) bool { + val := fl.Field().String() + return mongodbIdRegex().MatchString(val) +} + +// isMongoDBConnectionString is the validation function for validating if the current field's value is valid MongoDB Connection String +func isMongoDBConnectionString(fl FieldLevel) bool { + val := fl.Field().String() + return mongodbConnectionRegex().MatchString(val) +} + +// isSpiceDB is the validation function for validating if the current field's value is valid for use with Authzed SpiceDB in the indicated way +func isSpiceDB(fl FieldLevel) bool { + val := fl.Field().String() + param := fl.Param() + + switch param { + case "permission": + return spicedbPermissionRegex().MatchString(val) + case "type": + return spicedbTypeRegex().MatchString(val) + case "id", "": + return spicedbIDRegex().MatchString(val) + } + + panic("Unrecognized parameter: " + param) +} + +// isCreditCard is the validation function for validating if the current field's value is a valid credit card number +func isCreditCard(fl FieldLevel) bool { + val := fl.Field().String() + var creditCard bytes.Buffer + segments := strings.Split(val, " ") + for _, segment := range segments { + if len(segment) < 3 { + return false + } + creditCard.WriteString(segment) + } + + ccDigits := strings.Split(creditCard.String(), "") + size := len(ccDigits) + if size < 12 || size > 19 { + return false + } + + return digitsHaveLuhnChecksum(ccDigits) +} + +// hasLuhnChecksum is the validation for validating if the current field's value has a valid Luhn checksum +func hasLuhnChecksum(fl FieldLevel) bool { + field := fl.Field() + var str string // convert to a string which will then be split into single digits; easier and more readable than shifting/extracting single digits from a number + switch field.Kind() { + case reflect.String: + str = field.String() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + str = strconv.FormatInt(field.Int(), 10) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + str = strconv.FormatUint(field.Uint(), 10) + default: + panic(fmt.Sprintf("Bad field type %T", field.Interface())) + } + size := len(str) + if size < 2 { // there has to be at least one digit that carries a meaning + the checksum + return false + } + digits := strings.Split(str, "") + return digitsHaveLuhnChecksum(digits) +} + +// isCron is the validation function for validating if the current field's value is a valid cron expression +func isCron(fl FieldLevel) bool { + cronString := fl.Field().String() + return cronRegex().MatchString(cronString) +} diff --git a/vendor/github.com/go-playground/validator/v10/cache.go b/vendor/github.com/go-playground/validator/v10/cache.go new file mode 100644 index 00000000..2063e1b7 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/cache.go @@ -0,0 +1,332 @@ +package validator + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type tagType uint8 + +const ( + typeDefault tagType = iota + typeOmitEmpty + typeIsDefault + typeNoStructLevel + typeStructOnly + typeDive + typeOr + typeKeys + typeEndKeys + typeOmitNil +) + +const ( + invalidValidation = "Invalid validation tag on field '%s'" + undefinedValidation = "Undefined validation function '%s' on field '%s'" + keysTagNotDefined = "'" + endKeysTag + "' tag encountered without a corresponding '" + keysTag + "' tag" +) + +type structCache struct { + lock sync.Mutex + m atomic.Value // map[reflect.Type]*cStruct +} + +func (sc *structCache) Get(key reflect.Type) (c *cStruct, found bool) { + c, found = sc.m.Load().(map[reflect.Type]*cStruct)[key] + return +} + +func (sc *structCache) Set(key reflect.Type, value *cStruct) { + m := sc.m.Load().(map[reflect.Type]*cStruct) + nm := make(map[reflect.Type]*cStruct, len(m)+1) + for k, v := range m { + nm[k] = v + } + nm[key] = value + sc.m.Store(nm) +} + +type tagCache struct { + lock sync.Mutex + m atomic.Value // map[string]*cTag +} + +func (tc *tagCache) Get(key string) (c *cTag, found bool) { + c, found = tc.m.Load().(map[string]*cTag)[key] + return +} + +func (tc *tagCache) Set(key string, value *cTag) { + m := tc.m.Load().(map[string]*cTag) + nm := make(map[string]*cTag, len(m)+1) + for k, v := range m { + nm[k] = v + } + nm[key] = value + tc.m.Store(nm) +} + +type cStruct struct { + name string + fields []*cField + fn StructLevelFuncCtx +} + +type cField struct { + idx int + name string + altName string + namesEqual bool + cTags *cTag +} + +type cTag struct { + tag string + aliasTag string + actualAliasTag string + param string + keys *cTag // only populated when using tag's 'keys' and 'endkeys' for map key validation + next *cTag + fn FuncCtx + typeof tagType + hasTag bool + hasAlias bool + hasParam bool // true if parameter used eg. eq= where the equal sign has been set + isBlockEnd bool // indicates the current tag represents the last validation in the block + runValidationWhenNil bool +} + +func (v *Validate) extractStructCache(current reflect.Value, sName string) *cStruct { + v.structCache.lock.Lock() + defer v.structCache.lock.Unlock() // leave as defer! because if inner panics, it will never get unlocked otherwise! + + typ := current.Type() + + // could have been multiple trying to access, but once first is done this ensures struct + // isn't parsed again. + cs, ok := v.structCache.Get(typ) + if ok { + return cs + } + + cs = &cStruct{name: sName, fields: make([]*cField, 0), fn: v.structLevelFuncs[typ]} + + numFields := current.NumField() + rules := v.rules[typ] + + var ctag *cTag + var fld reflect.StructField + var tag string + var customName string + + for i := 0; i < numFields; i++ { + + fld = typ.Field(i) + + if !v.privateFieldValidation && !fld.Anonymous && len(fld.PkgPath) > 0 { + continue + } + + if rtag, ok := rules[fld.Name]; ok { + tag = rtag + } else { + tag = fld.Tag.Get(v.tagName) + } + + if tag == skipValidationTag { + continue + } + + customName = fld.Name + + if v.hasTagNameFunc { + name := v.tagNameFunc(fld) + if len(name) > 0 { + customName = name + } + } + + // NOTE: cannot use shared tag cache, because tags may be equal, but things like alias may be different + // and so only struct level caching can be used instead of combined with Field tag caching + + if len(tag) > 0 { + ctag, _ = v.parseFieldTagsRecursive(tag, fld.Name, "", false) + } else { + // even if field doesn't have validations need cTag for traversing to potential inner/nested + // elements of the field. + ctag = new(cTag) + } + + cs.fields = append(cs.fields, &cField{ + idx: i, + name: fld.Name, + altName: customName, + cTags: ctag, + namesEqual: fld.Name == customName, + }) + } + v.structCache.Set(typ, cs) + return cs +} + +func (v *Validate) parseFieldTagsRecursive(tag string, fieldName string, alias string, hasAlias bool) (firstCtag *cTag, current *cTag) { + var t string + noAlias := len(alias) == 0 + tags := strings.Split(tag, tagSeparator) + + for i := 0; i < len(tags); i++ { + t = tags[i] + if noAlias { + alias = t + } + + // check map for alias and process new tags, otherwise process as usual + if tagsVal, found := v.aliases[t]; found { + if i == 0 { + firstCtag, current = v.parseFieldTagsRecursive(tagsVal, fieldName, t, true) + } else { + next, curr := v.parseFieldTagsRecursive(tagsVal, fieldName, t, true) + current.next, current = next, curr + + } + continue + } + + var prevTag tagType + + if i == 0 { + current = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true, typeof: typeDefault} + firstCtag = current + } else { + prevTag = current.typeof + current.next = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true} + current = current.next + } + + switch t { + case diveTag: + current.typeof = typeDive + continue + + case keysTag: + current.typeof = typeKeys + + if i == 0 || prevTag != typeDive { + panic(fmt.Sprintf("'%s' tag must be immediately preceded by the '%s' tag", keysTag, diveTag)) + } + + current.typeof = typeKeys + + // need to pass along only keys tag + // need to increment i to skip over the keys tags + b := make([]byte, 0, 64) + + i++ + + for ; i < len(tags); i++ { + + b = append(b, tags[i]...) + b = append(b, ',') + + if tags[i] == endKeysTag { + break + } + } + + current.keys, _ = v.parseFieldTagsRecursive(string(b[:len(b)-1]), fieldName, "", false) + continue + + case endKeysTag: + current.typeof = typeEndKeys + + // if there are more in tags then there was no keysTag defined + // and an error should be thrown + if i != len(tags)-1 { + panic(keysTagNotDefined) + } + return + + case omitempty: + current.typeof = typeOmitEmpty + continue + + case omitnil: + current.typeof = typeOmitNil + continue + + case structOnlyTag: + current.typeof = typeStructOnly + continue + + case noStructLevelTag: + current.typeof = typeNoStructLevel + continue + + default: + if t == isdefault { + current.typeof = typeIsDefault + } + // if a pipe character is needed within the param you must use the utf8Pipe representation "0x7C" + orVals := strings.Split(t, orSeparator) + + for j := 0; j < len(orVals); j++ { + vals := strings.SplitN(orVals[j], tagKeySeparator, 2) + if noAlias { + alias = vals[0] + current.aliasTag = alias + } else { + current.actualAliasTag = t + } + + if j > 0 { + current.next = &cTag{aliasTag: alias, actualAliasTag: current.actualAliasTag, hasAlias: hasAlias, hasTag: true} + current = current.next + } + current.hasParam = len(vals) > 1 + + current.tag = vals[0] + if len(current.tag) == 0 { + panic(strings.TrimSpace(fmt.Sprintf(invalidValidation, fieldName))) + } + + if wrapper, ok := v.validations[current.tag]; ok { + current.fn = wrapper.fn + current.runValidationWhenNil = wrapper.runValidationOnNil + } else { + panic(strings.TrimSpace(fmt.Sprintf(undefinedValidation, current.tag, fieldName))) + } + + if len(orVals) > 1 { + current.typeof = typeOr + } + + if len(vals) > 1 { + current.param = strings.Replace(strings.Replace(vals[1], utf8HexComma, ",", -1), utf8Pipe, "|", -1) + } + } + current.isBlockEnd = true + } + } + return +} + +func (v *Validate) fetchCacheTag(tag string) *cTag { + // find cached tag + ctag, found := v.tagCache.Get(tag) + if !found { + v.tagCache.lock.Lock() + defer v.tagCache.lock.Unlock() + + // could have been multiple trying to access, but once first is done this ensures tag + // isn't parsed again. + ctag, found = v.tagCache.Get(tag) + if !found { + ctag, _ = v.parseFieldTagsRecursive(tag, "", "", false) + v.tagCache.Set(tag, ctag) + } + } + return ctag +} diff --git a/vendor/github.com/go-playground/validator/v10/country_codes.go b/vendor/github.com/go-playground/validator/v10/country_codes.go new file mode 100644 index 00000000..b5f10d3c --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/country_codes.go @@ -0,0 +1,1177 @@ +package validator + +var iso3166_1_alpha2 = map[string]struct{}{ + // see: https://www.iso.org/iso-3166-country-codes.html + "AF": {}, "AX": {}, "AL": {}, "DZ": {}, "AS": {}, + "AD": {}, "AO": {}, "AI": {}, "AQ": {}, "AG": {}, + "AR": {}, "AM": {}, "AW": {}, "AU": {}, "AT": {}, + "AZ": {}, "BS": {}, "BH": {}, "BD": {}, "BB": {}, + "BY": {}, "BE": {}, "BZ": {}, "BJ": {}, "BM": {}, + "BT": {}, "BO": {}, "BQ": {}, "BA": {}, "BW": {}, + "BV": {}, "BR": {}, "IO": {}, "BN": {}, "BG": {}, + "BF": {}, "BI": {}, "KH": {}, "CM": {}, "CA": {}, + "CV": {}, "KY": {}, "CF": {}, "TD": {}, "CL": {}, + "CN": {}, "CX": {}, "CC": {}, "CO": {}, "KM": {}, + "CG": {}, "CD": {}, "CK": {}, "CR": {}, "CI": {}, + "HR": {}, "CU": {}, "CW": {}, "CY": {}, "CZ": {}, + "DK": {}, "DJ": {}, "DM": {}, "DO": {}, "EC": {}, + "EG": {}, "SV": {}, "GQ": {}, "ER": {}, "EE": {}, + "ET": {}, "FK": {}, "FO": {}, "FJ": {}, "FI": {}, + "FR": {}, "GF": {}, "PF": {}, "TF": {}, "GA": {}, + "GM": {}, "GE": {}, "DE": {}, "GH": {}, "GI": {}, + "GR": {}, "GL": {}, "GD": {}, "GP": {}, "GU": {}, + "GT": {}, "GG": {}, "GN": {}, "GW": {}, "GY": {}, + "HT": {}, "HM": {}, "VA": {}, "HN": {}, "HK": {}, + "HU": {}, "IS": {}, "IN": {}, "ID": {}, "IR": {}, + "IQ": {}, "IE": {}, "IM": {}, "IL": {}, "IT": {}, + "JM": {}, "JP": {}, "JE": {}, "JO": {}, "KZ": {}, + "KE": {}, "KI": {}, "KP": {}, "KR": {}, "KW": {}, + "KG": {}, "LA": {}, "LV": {}, "LB": {}, "LS": {}, + "LR": {}, "LY": {}, "LI": {}, "LT": {}, "LU": {}, + "MO": {}, "MK": {}, "MG": {}, "MW": {}, "MY": {}, + "MV": {}, "ML": {}, "MT": {}, "MH": {}, "MQ": {}, + "MR": {}, "MU": {}, "YT": {}, "MX": {}, "FM": {}, + "MD": {}, "MC": {}, "MN": {}, "ME": {}, "MS": {}, + "MA": {}, "MZ": {}, "MM": {}, "NA": {}, "NR": {}, + "NP": {}, "NL": {}, "NC": {}, "NZ": {}, "NI": {}, + "NE": {}, "NG": {}, "NU": {}, "NF": {}, "MP": {}, + "NO": {}, "OM": {}, "PK": {}, "PW": {}, "PS": {}, + "PA": {}, "PG": {}, "PY": {}, "PE": {}, "PH": {}, + "PN": {}, "PL": {}, "PT": {}, "PR": {}, "QA": {}, + "RE": {}, "RO": {}, "RU": {}, "RW": {}, "BL": {}, + "SH": {}, "KN": {}, "LC": {}, "MF": {}, "PM": {}, + "VC": {}, "WS": {}, "SM": {}, "ST": {}, "SA": {}, + "SN": {}, "RS": {}, "SC": {}, "SL": {}, "SG": {}, + "SX": {}, "SK": {}, "SI": {}, "SB": {}, "SO": {}, + "ZA": {}, "GS": {}, "SS": {}, "ES": {}, "LK": {}, + "SD": {}, "SR": {}, "SJ": {}, "SZ": {}, "SE": {}, + "CH": {}, "SY": {}, "TW": {}, "TJ": {}, "TZ": {}, + "TH": {}, "TL": {}, "TG": {}, "TK": {}, "TO": {}, + "TT": {}, "TN": {}, "TR": {}, "TM": {}, "TC": {}, + "TV": {}, "UG": {}, "UA": {}, "AE": {}, "GB": {}, + "US": {}, "UM": {}, "UY": {}, "UZ": {}, "VU": {}, + "VE": {}, "VN": {}, "VG": {}, "VI": {}, "WF": {}, + "EH": {}, "YE": {}, "ZM": {}, "ZW": {}, "XK": {}, +} + +var iso3166_1_alpha2_eu = map[string]struct{}{ + "AT": {}, "BE": {}, "BG": {}, "HR": {}, "CY": {}, + "CZ": {}, "DK": {}, "EE": {}, "FI": {}, "FR": {}, + "DE": {}, "GR": {}, "HU": {}, "IE": {}, "IT": {}, + "LV": {}, "LT": {}, "LU": {}, "MT": {}, "NL": {}, + "PL": {}, "PT": {}, "RO": {}, "SK": {}, "SI": {}, + "ES": {}, "SE": {}, +} + +var iso3166_1_alpha3 = map[string]struct{}{ + // see: https://www.iso.org/iso-3166-country-codes.html + "AFG": {}, "ALB": {}, "DZA": {}, "ASM": {}, "AND": {}, + "AGO": {}, "AIA": {}, "ATA": {}, "ATG": {}, "ARG": {}, + "ARM": {}, "ABW": {}, "AUS": {}, "AUT": {}, "AZE": {}, + "BHS": {}, "BHR": {}, "BGD": {}, "BRB": {}, "BLR": {}, + "BEL": {}, "BLZ": {}, "BEN": {}, "BMU": {}, "BTN": {}, + "BOL": {}, "BES": {}, "BIH": {}, "BWA": {}, "BVT": {}, + "BRA": {}, "IOT": {}, "BRN": {}, "BGR": {}, "BFA": {}, + "BDI": {}, "CPV": {}, "KHM": {}, "CMR": {}, "CAN": {}, + "CYM": {}, "CAF": {}, "TCD": {}, "CHL": {}, "CHN": {}, + "CXR": {}, "CCK": {}, "COL": {}, "COM": {}, "COD": {}, + "COG": {}, "COK": {}, "CRI": {}, "HRV": {}, "CUB": {}, + "CUW": {}, "CYP": {}, "CZE": {}, "CIV": {}, "DNK": {}, + "DJI": {}, "DMA": {}, "DOM": {}, "ECU": {}, "EGY": {}, + "SLV": {}, "GNQ": {}, "ERI": {}, "EST": {}, "SWZ": {}, + "ETH": {}, "FLK": {}, "FRO": {}, "FJI": {}, "FIN": {}, + "FRA": {}, "GUF": {}, "PYF": {}, "ATF": {}, "GAB": {}, + "GMB": {}, "GEO": {}, "DEU": {}, "GHA": {}, "GIB": {}, + "GRC": {}, "GRL": {}, "GRD": {}, "GLP": {}, "GUM": {}, + "GTM": {}, "GGY": {}, "GIN": {}, "GNB": {}, "GUY": {}, + "HTI": {}, "HMD": {}, "VAT": {}, "HND": {}, "HKG": {}, + "HUN": {}, "ISL": {}, "IND": {}, "IDN": {}, "IRN": {}, + "IRQ": {}, "IRL": {}, "IMN": {}, "ISR": {}, "ITA": {}, + "JAM": {}, "JPN": {}, "JEY": {}, "JOR": {}, "KAZ": {}, + "KEN": {}, "KIR": {}, "PRK": {}, "KOR": {}, "KWT": {}, + "KGZ": {}, "LAO": {}, "LVA": {}, "LBN": {}, "LSO": {}, + "LBR": {}, "LBY": {}, "LIE": {}, "LTU": {}, "LUX": {}, + "MAC": {}, "MDG": {}, "MWI": {}, "MYS": {}, "MDV": {}, + "MLI": {}, "MLT": {}, "MHL": {}, "MTQ": {}, "MRT": {}, + "MUS": {}, "MYT": {}, "MEX": {}, "FSM": {}, "MDA": {}, + "MCO": {}, "MNG": {}, "MNE": {}, "MSR": {}, "MAR": {}, + "MOZ": {}, "MMR": {}, "NAM": {}, "NRU": {}, "NPL": {}, + "NLD": {}, "NCL": {}, "NZL": {}, "NIC": {}, "NER": {}, + "NGA": {}, "NIU": {}, "NFK": {}, "MKD": {}, "MNP": {}, + "NOR": {}, "OMN": {}, "PAK": {}, "PLW": {}, "PSE": {}, + "PAN": {}, "PNG": {}, "PRY": {}, "PER": {}, "PHL": {}, + "PCN": {}, "POL": {}, "PRT": {}, "PRI": {}, "QAT": {}, + "ROU": {}, "RUS": {}, "RWA": {}, "REU": {}, "BLM": {}, + "SHN": {}, "KNA": {}, "LCA": {}, "MAF": {}, "SPM": {}, + "VCT": {}, "WSM": {}, "SMR": {}, "STP": {}, "SAU": {}, + "SEN": {}, "SRB": {}, "SYC": {}, "SLE": {}, "SGP": {}, + "SXM": {}, "SVK": {}, "SVN": {}, "SLB": {}, "SOM": {}, + "ZAF": {}, "SGS": {}, "SSD": {}, "ESP": {}, "LKA": {}, + "SDN": {}, "SUR": {}, "SJM": {}, "SWE": {}, "CHE": {}, + "SYR": {}, "TWN": {}, "TJK": {}, "TZA": {}, "THA": {}, + "TLS": {}, "TGO": {}, "TKL": {}, "TON": {}, "TTO": {}, + "TUN": {}, "TUR": {}, "TKM": {}, "TCA": {}, "TUV": {}, + "UGA": {}, "UKR": {}, "ARE": {}, "GBR": {}, "UMI": {}, + "USA": {}, "URY": {}, "UZB": {}, "VUT": {}, "VEN": {}, + "VNM": {}, "VGB": {}, "VIR": {}, "WLF": {}, "ESH": {}, + "YEM": {}, "ZMB": {}, "ZWE": {}, "ALA": {}, "UNK": {}, +} + +var iso3166_1_alpha3_eu = map[string]struct{}{ + "AUT": {}, "BEL": {}, "BGR": {}, "HRV": {}, "CYP": {}, + "CZE": {}, "DNK": {}, "EST": {}, "FIN": {}, "FRA": {}, + "DEU": {}, "GRC": {}, "HUN": {}, "IRL": {}, "ITA": {}, + "LVA": {}, "LTU": {}, "LUX": {}, "MLT": {}, "NLD": {}, + "POL": {}, "PRT": {}, "ROU": {}, "SVK": {}, "SVN": {}, + "ESP": {}, "SWE": {}, +} +var iso3166_1_alpha_numeric = map[int]struct{}{ + // see: https://www.iso.org/iso-3166-country-codes.html + 4: {}, 8: {}, 12: {}, 16: {}, 20: {}, + 24: {}, 660: {}, 10: {}, 28: {}, 32: {}, + 51: {}, 533: {}, 36: {}, 40: {}, 31: {}, + 44: {}, 48: {}, 50: {}, 52: {}, 112: {}, + 56: {}, 84: {}, 204: {}, 60: {}, 64: {}, + 68: {}, 535: {}, 70: {}, 72: {}, 74: {}, + 76: {}, 86: {}, 96: {}, 100: {}, 854: {}, + 108: {}, 132: {}, 116: {}, 120: {}, 124: {}, + 136: {}, 140: {}, 148: {}, 152: {}, 156: {}, + 162: {}, 166: {}, 170: {}, 174: {}, 180: {}, + 178: {}, 184: {}, 188: {}, 191: {}, 192: {}, + 531: {}, 196: {}, 203: {}, 384: {}, 208: {}, + 262: {}, 212: {}, 214: {}, 218: {}, 818: {}, + 222: {}, 226: {}, 232: {}, 233: {}, 748: {}, + 231: {}, 238: {}, 234: {}, 242: {}, 246: {}, + 250: {}, 254: {}, 258: {}, 260: {}, 266: {}, + 270: {}, 268: {}, 276: {}, 288: {}, 292: {}, + 300: {}, 304: {}, 308: {}, 312: {}, 316: {}, + 320: {}, 831: {}, 324: {}, 624: {}, 328: {}, + 332: {}, 334: {}, 336: {}, 340: {}, 344: {}, + 348: {}, 352: {}, 356: {}, 360: {}, 364: {}, + 368: {}, 372: {}, 833: {}, 376: {}, 380: {}, + 388: {}, 392: {}, 832: {}, 400: {}, 398: {}, + 404: {}, 296: {}, 408: {}, 410: {}, 414: {}, + 417: {}, 418: {}, 428: {}, 422: {}, 426: {}, + 430: {}, 434: {}, 438: {}, 440: {}, 442: {}, + 446: {}, 450: {}, 454: {}, 458: {}, 462: {}, + 466: {}, 470: {}, 584: {}, 474: {}, 478: {}, + 480: {}, 175: {}, 484: {}, 583: {}, 498: {}, + 492: {}, 496: {}, 499: {}, 500: {}, 504: {}, + 508: {}, 104: {}, 516: {}, 520: {}, 524: {}, + 528: {}, 540: {}, 554: {}, 558: {}, 562: {}, + 566: {}, 570: {}, 574: {}, 807: {}, 580: {}, + 578: {}, 512: {}, 586: {}, 585: {}, 275: {}, + 591: {}, 598: {}, 600: {}, 604: {}, 608: {}, + 612: {}, 616: {}, 620: {}, 630: {}, 634: {}, + 642: {}, 643: {}, 646: {}, 638: {}, 652: {}, + 654: {}, 659: {}, 662: {}, 663: {}, 666: {}, + 670: {}, 882: {}, 674: {}, 678: {}, 682: {}, + 686: {}, 688: {}, 690: {}, 694: {}, 702: {}, + 534: {}, 703: {}, 705: {}, 90: {}, 706: {}, + 710: {}, 239: {}, 728: {}, 724: {}, 144: {}, + 729: {}, 740: {}, 744: {}, 752: {}, 756: {}, + 760: {}, 158: {}, 762: {}, 834: {}, 764: {}, + 626: {}, 768: {}, 772: {}, 776: {}, 780: {}, + 788: {}, 792: {}, 795: {}, 796: {}, 798: {}, + 800: {}, 804: {}, 784: {}, 826: {}, 581: {}, + 840: {}, 858: {}, 860: {}, 548: {}, 862: {}, + 704: {}, 92: {}, 850: {}, 876: {}, 732: {}, + 887: {}, 894: {}, 716: {}, 248: {}, 153: {}, +} + +var iso3166_1_alpha_numeric_eu = map[int]struct{}{ + 40: {}, 56: {}, 100: {}, 191: {}, 196: {}, + 200: {}, 208: {}, 233: {}, 246: {}, 250: {}, + 276: {}, 300: {}, 348: {}, 372: {}, 380: {}, + 428: {}, 440: {}, 442: {}, 470: {}, 528: {}, + 616: {}, 620: {}, 642: {}, 703: {}, 705: {}, + 724: {}, 752: {}, +} + +var iso3166_2 = map[string]struct{}{ + "AD-02": {}, "AD-03": {}, "AD-04": {}, "AD-05": {}, "AD-06": {}, + "AD-07": {}, "AD-08": {}, "AE-AJ": {}, "AE-AZ": {}, "AE-DU": {}, + "AE-FU": {}, "AE-RK": {}, "AE-SH": {}, "AE-UQ": {}, "AF-BAL": {}, + "AF-BAM": {}, "AF-BDG": {}, "AF-BDS": {}, "AF-BGL": {}, "AF-DAY": {}, + "AF-FRA": {}, "AF-FYB": {}, "AF-GHA": {}, "AF-GHO": {}, "AF-HEL": {}, + "AF-HER": {}, "AF-JOW": {}, "AF-KAB": {}, "AF-KAN": {}, "AF-KAP": {}, + "AF-KDZ": {}, "AF-KHO": {}, "AF-KNR": {}, "AF-LAG": {}, "AF-LOG": {}, + "AF-NAN": {}, "AF-NIM": {}, "AF-NUR": {}, "AF-PAN": {}, "AF-PAR": {}, + "AF-PIA": {}, "AF-PKA": {}, "AF-SAM": {}, "AF-SAR": {}, "AF-TAK": {}, + "AF-URU": {}, "AF-WAR": {}, "AF-ZAB": {}, "AG-03": {}, "AG-04": {}, + "AG-05": {}, "AG-06": {}, "AG-07": {}, "AG-08": {}, "AG-10": {}, + "AG-11": {}, "AL-01": {}, "AL-02": {}, "AL-03": {}, "AL-04": {}, + "AL-05": {}, "AL-06": {}, "AL-07": {}, "AL-08": {}, "AL-09": {}, + "AL-10": {}, "AL-11": {}, "AL-12": {}, "AL-BR": {}, "AL-BU": {}, + "AL-DI": {}, "AL-DL": {}, "AL-DR": {}, "AL-DV": {}, "AL-EL": {}, + "AL-ER": {}, "AL-FR": {}, "AL-GJ": {}, "AL-GR": {}, "AL-HA": {}, + "AL-KA": {}, "AL-KB": {}, "AL-KC": {}, "AL-KO": {}, "AL-KR": {}, + "AL-KU": {}, "AL-LB": {}, "AL-LE": {}, "AL-LU": {}, "AL-MK": {}, + "AL-MM": {}, "AL-MR": {}, "AL-MT": {}, "AL-PG": {}, "AL-PQ": {}, + "AL-PR": {}, "AL-PU": {}, "AL-SH": {}, "AL-SK": {}, "AL-SR": {}, + "AL-TE": {}, "AL-TP": {}, "AL-TR": {}, "AL-VL": {}, "AM-AG": {}, + "AM-AR": {}, "AM-AV": {}, "AM-ER": {}, "AM-GR": {}, "AM-KT": {}, + "AM-LO": {}, "AM-SH": {}, "AM-SU": {}, "AM-TV": {}, "AM-VD": {}, + "AO-BGO": {}, "AO-BGU": {}, "AO-BIE": {}, "AO-CAB": {}, "AO-CCU": {}, + "AO-CNN": {}, "AO-CNO": {}, "AO-CUS": {}, "AO-HUA": {}, "AO-HUI": {}, + "AO-LNO": {}, "AO-LSU": {}, "AO-LUA": {}, "AO-MAL": {}, "AO-MOX": {}, + "AO-NAM": {}, "AO-UIG": {}, "AO-ZAI": {}, "AR-A": {}, "AR-B": {}, + "AR-C": {}, "AR-D": {}, "AR-E": {}, "AR-F": {}, "AR-G": {}, "AR-H": {}, + "AR-J": {}, "AR-K": {}, "AR-L": {}, "AR-M": {}, "AR-N": {}, + "AR-P": {}, "AR-Q": {}, "AR-R": {}, "AR-S": {}, "AR-T": {}, + "AR-U": {}, "AR-V": {}, "AR-W": {}, "AR-X": {}, "AR-Y": {}, + "AR-Z": {}, "AT-1": {}, "AT-2": {}, "AT-3": {}, "AT-4": {}, + "AT-5": {}, "AT-6": {}, "AT-7": {}, "AT-8": {}, "AT-9": {}, + "AU-ACT": {}, "AU-NSW": {}, "AU-NT": {}, "AU-QLD": {}, "AU-SA": {}, + "AU-TAS": {}, "AU-VIC": {}, "AU-WA": {}, "AZ-ABS": {}, "AZ-AGA": {}, + "AZ-AGC": {}, "AZ-AGM": {}, "AZ-AGS": {}, "AZ-AGU": {}, "AZ-AST": {}, + "AZ-BA": {}, "AZ-BAB": {}, "AZ-BAL": {}, "AZ-BAR": {}, "AZ-BEY": {}, + "AZ-BIL": {}, "AZ-CAB": {}, "AZ-CAL": {}, "AZ-CUL": {}, "AZ-DAS": {}, + "AZ-FUZ": {}, "AZ-GA": {}, "AZ-GAD": {}, "AZ-GOR": {}, "AZ-GOY": {}, + "AZ-GYG": {}, "AZ-HAC": {}, "AZ-IMI": {}, "AZ-ISM": {}, "AZ-KAL": {}, + "AZ-KAN": {}, "AZ-KUR": {}, "AZ-LA": {}, "AZ-LAC": {}, "AZ-LAN": {}, + "AZ-LER": {}, "AZ-MAS": {}, "AZ-MI": {}, "AZ-NA": {}, "AZ-NEF": {}, + "AZ-NV": {}, "AZ-NX": {}, "AZ-OGU": {}, "AZ-ORD": {}, "AZ-QAB": {}, + "AZ-QAX": {}, "AZ-QAZ": {}, "AZ-QBA": {}, "AZ-QBI": {}, "AZ-QOB": {}, + "AZ-QUS": {}, "AZ-SA": {}, "AZ-SAB": {}, "AZ-SAD": {}, "AZ-SAH": {}, + "AZ-SAK": {}, "AZ-SAL": {}, "AZ-SAR": {}, "AZ-SAT": {}, "AZ-SBN": {}, + "AZ-SIY": {}, "AZ-SKR": {}, "AZ-SM": {}, "AZ-SMI": {}, "AZ-SMX": {}, + "AZ-SR": {}, "AZ-SUS": {}, "AZ-TAR": {}, "AZ-TOV": {}, "AZ-UCA": {}, + "AZ-XA": {}, "AZ-XAC": {}, "AZ-XCI": {}, "AZ-XIZ": {}, "AZ-XVD": {}, + "AZ-YAR": {}, "AZ-YE": {}, "AZ-YEV": {}, "AZ-ZAN": {}, "AZ-ZAQ": {}, + "AZ-ZAR": {}, "BA-01": {}, "BA-02": {}, "BA-03": {}, "BA-04": {}, + "BA-05": {}, "BA-06": {}, "BA-07": {}, "BA-08": {}, "BA-09": {}, + "BA-10": {}, "BA-BIH": {}, "BA-BRC": {}, "BA-SRP": {}, "BB-01": {}, + "BB-02": {}, "BB-03": {}, "BB-04": {}, "BB-05": {}, "BB-06": {}, + "BB-07": {}, "BB-08": {}, "BB-09": {}, "BB-10": {}, "BB-11": {}, + "BD-01": {}, "BD-02": {}, "BD-03": {}, "BD-04": {}, "BD-05": {}, + "BD-06": {}, "BD-07": {}, "BD-08": {}, "BD-09": {}, "BD-10": {}, + "BD-11": {}, "BD-12": {}, "BD-13": {}, "BD-14": {}, "BD-15": {}, + "BD-16": {}, "BD-17": {}, "BD-18": {}, "BD-19": {}, "BD-20": {}, + "BD-21": {}, "BD-22": {}, "BD-23": {}, "BD-24": {}, "BD-25": {}, + "BD-26": {}, "BD-27": {}, "BD-28": {}, "BD-29": {}, "BD-30": {}, + "BD-31": {}, "BD-32": {}, "BD-33": {}, "BD-34": {}, "BD-35": {}, + "BD-36": {}, "BD-37": {}, "BD-38": {}, "BD-39": {}, "BD-40": {}, + "BD-41": {}, "BD-42": {}, "BD-43": {}, "BD-44": {}, "BD-45": {}, + "BD-46": {}, "BD-47": {}, "BD-48": {}, "BD-49": {}, "BD-50": {}, + "BD-51": {}, "BD-52": {}, "BD-53": {}, "BD-54": {}, "BD-55": {}, + "BD-56": {}, "BD-57": {}, "BD-58": {}, "BD-59": {}, "BD-60": {}, + "BD-61": {}, "BD-62": {}, "BD-63": {}, "BD-64": {}, "BD-A": {}, + "BD-B": {}, "BD-C": {}, "BD-D": {}, "BD-E": {}, "BD-F": {}, + "BD-G": {}, "BE-BRU": {}, "BE-VAN": {}, "BE-VBR": {}, "BE-VLG": {}, + "BE-VLI": {}, "BE-VOV": {}, "BE-VWV": {}, "BE-WAL": {}, "BE-WBR": {}, + "BE-WHT": {}, "BE-WLG": {}, "BE-WLX": {}, "BE-WNA": {}, "BF-01": {}, + "BF-02": {}, "BF-03": {}, "BF-04": {}, "BF-05": {}, "BF-06": {}, + "BF-07": {}, "BF-08": {}, "BF-09": {}, "BF-10": {}, "BF-11": {}, + "BF-12": {}, "BF-13": {}, "BF-BAL": {}, "BF-BAM": {}, "BF-BAN": {}, + "BF-BAZ": {}, "BF-BGR": {}, "BF-BLG": {}, "BF-BLK": {}, "BF-COM": {}, + "BF-GAN": {}, "BF-GNA": {}, "BF-GOU": {}, "BF-HOU": {}, "BF-IOB": {}, + "BF-KAD": {}, "BF-KEN": {}, "BF-KMD": {}, "BF-KMP": {}, "BF-KOP": {}, + "BF-KOS": {}, "BF-KOT": {}, "BF-KOW": {}, "BF-LER": {}, "BF-LOR": {}, + "BF-MOU": {}, "BF-NAM": {}, "BF-NAO": {}, "BF-NAY": {}, "BF-NOU": {}, + "BF-OUB": {}, "BF-OUD": {}, "BF-PAS": {}, "BF-PON": {}, "BF-SEN": {}, + "BF-SIS": {}, "BF-SMT": {}, "BF-SNG": {}, "BF-SOM": {}, "BF-SOR": {}, + "BF-TAP": {}, "BF-TUI": {}, "BF-YAG": {}, "BF-YAT": {}, "BF-ZIR": {}, + "BF-ZON": {}, "BF-ZOU": {}, "BG-01": {}, "BG-02": {}, "BG-03": {}, + "BG-04": {}, "BG-05": {}, "BG-06": {}, "BG-07": {}, "BG-08": {}, + "BG-09": {}, "BG-10": {}, "BG-11": {}, "BG-12": {}, "BG-13": {}, + "BG-14": {}, "BG-15": {}, "BG-16": {}, "BG-17": {}, "BG-18": {}, + "BG-19": {}, "BG-20": {}, "BG-21": {}, "BG-22": {}, "BG-23": {}, + "BG-24": {}, "BG-25": {}, "BG-26": {}, "BG-27": {}, "BG-28": {}, + "BH-13": {}, "BH-14": {}, "BH-15": {}, "BH-16": {}, "BH-17": {}, + "BI-BB": {}, "BI-BL": {}, "BI-BM": {}, "BI-BR": {}, "BI-CA": {}, + "BI-CI": {}, "BI-GI": {}, "BI-KI": {}, "BI-KR": {}, "BI-KY": {}, + "BI-MA": {}, "BI-MU": {}, "BI-MW": {}, "BI-NG": {}, "BI-RM": {}, "BI-RT": {}, + "BI-RY": {}, "BJ-AK": {}, "BJ-AL": {}, "BJ-AQ": {}, "BJ-BO": {}, + "BJ-CO": {}, "BJ-DO": {}, "BJ-KO": {}, "BJ-LI": {}, "BJ-MO": {}, + "BJ-OU": {}, "BJ-PL": {}, "BJ-ZO": {}, "BN-BE": {}, "BN-BM": {}, + "BN-TE": {}, "BN-TU": {}, "BO-B": {}, "BO-C": {}, "BO-H": {}, + "BO-L": {}, "BO-N": {}, "BO-O": {}, "BO-P": {}, "BO-S": {}, + "BO-T": {}, "BQ-BO": {}, "BQ-SA": {}, "BQ-SE": {}, "BR-AC": {}, + "BR-AL": {}, "BR-AM": {}, "BR-AP": {}, "BR-BA": {}, "BR-CE": {}, + "BR-DF": {}, "BR-ES": {}, "BR-FN": {}, "BR-GO": {}, "BR-MA": {}, + "BR-MG": {}, "BR-MS": {}, "BR-MT": {}, "BR-PA": {}, "BR-PB": {}, + "BR-PE": {}, "BR-PI": {}, "BR-PR": {}, "BR-RJ": {}, "BR-RN": {}, + "BR-RO": {}, "BR-RR": {}, "BR-RS": {}, "BR-SC": {}, "BR-SE": {}, + "BR-SP": {}, "BR-TO": {}, "BS-AK": {}, "BS-BI": {}, "BS-BP": {}, + "BS-BY": {}, "BS-CE": {}, "BS-CI": {}, "BS-CK": {}, "BS-CO": {}, + "BS-CS": {}, "BS-EG": {}, "BS-EX": {}, "BS-FP": {}, "BS-GC": {}, + "BS-HI": {}, "BS-HT": {}, "BS-IN": {}, "BS-LI": {}, "BS-MC": {}, + "BS-MG": {}, "BS-MI": {}, "BS-NE": {}, "BS-NO": {}, "BS-NP": {}, "BS-NS": {}, + "BS-RC": {}, "BS-RI": {}, "BS-SA": {}, "BS-SE": {}, "BS-SO": {}, + "BS-SS": {}, "BS-SW": {}, "BS-WG": {}, "BT-11": {}, "BT-12": {}, + "BT-13": {}, "BT-14": {}, "BT-15": {}, "BT-21": {}, "BT-22": {}, + "BT-23": {}, "BT-24": {}, "BT-31": {}, "BT-32": {}, "BT-33": {}, + "BT-34": {}, "BT-41": {}, "BT-42": {}, "BT-43": {}, "BT-44": {}, + "BT-45": {}, "BT-GA": {}, "BT-TY": {}, "BW-CE": {}, "BW-CH": {}, "BW-GH": {}, + "BW-KG": {}, "BW-KL": {}, "BW-KW": {}, "BW-NE": {}, "BW-NW": {}, + "BW-SE": {}, "BW-SO": {}, "BY-BR": {}, "BY-HM": {}, "BY-HO": {}, + "BY-HR": {}, "BY-MA": {}, "BY-MI": {}, "BY-VI": {}, "BZ-BZ": {}, + "BZ-CY": {}, "BZ-CZL": {}, "BZ-OW": {}, "BZ-SC": {}, "BZ-TOL": {}, + "CA-AB": {}, "CA-BC": {}, "CA-MB": {}, "CA-NB": {}, "CA-NL": {}, + "CA-NS": {}, "CA-NT": {}, "CA-NU": {}, "CA-ON": {}, "CA-PE": {}, + "CA-QC": {}, "CA-SK": {}, "CA-YT": {}, "CD-BC": {}, "CD-BN": {}, + "CD-EQ": {}, "CD-HK": {}, "CD-IT": {}, "CD-KA": {}, "CD-KC": {}, "CD-KE": {}, "CD-KG": {}, "CD-KN": {}, + "CD-KW": {}, "CD-KS": {}, "CD-LU": {}, "CD-MA": {}, "CD-NK": {}, "CD-OR": {}, "CD-SA": {}, "CD-SK": {}, + "CD-TA": {}, "CD-TO": {}, "CF-AC": {}, "CF-BB": {}, "CF-BGF": {}, "CF-BK": {}, "CF-HK": {}, "CF-HM": {}, + "CF-HS": {}, "CF-KB": {}, "CF-KG": {}, "CF-LB": {}, "CF-MB": {}, + "CF-MP": {}, "CF-NM": {}, "CF-OP": {}, "CF-SE": {}, "CF-UK": {}, + "CF-VK": {}, "CG-11": {}, "CG-12": {}, "CG-13": {}, "CG-14": {}, + "CG-15": {}, "CG-16": {}, "CG-2": {}, "CG-5": {}, "CG-7": {}, "CG-8": {}, + "CG-9": {}, "CG-BZV": {}, "CH-AG": {}, "CH-AI": {}, "CH-AR": {}, + "CH-BE": {}, "CH-BL": {}, "CH-BS": {}, "CH-FR": {}, "CH-GE": {}, + "CH-GL": {}, "CH-GR": {}, "CH-JU": {}, "CH-LU": {}, "CH-NE": {}, + "CH-NW": {}, "CH-OW": {}, "CH-SG": {}, "CH-SH": {}, "CH-SO": {}, + "CH-SZ": {}, "CH-TG": {}, "CH-TI": {}, "CH-UR": {}, "CH-VD": {}, + "CH-VS": {}, "CH-ZG": {}, "CH-ZH": {}, "CI-AB": {}, "CI-BS": {}, + "CI-CM": {}, "CI-DN": {}, "CI-GD": {}, "CI-LC": {}, "CI-LG": {}, + "CI-MG": {}, "CI-SM": {}, "CI-SV": {}, "CI-VB": {}, "CI-WR": {}, + "CI-YM": {}, "CI-ZZ": {}, "CL-AI": {}, "CL-AN": {}, "CL-AP": {}, + "CL-AR": {}, "CL-AT": {}, "CL-BI": {}, "CL-CO": {}, "CL-LI": {}, + "CL-LL": {}, "CL-LR": {}, "CL-MA": {}, "CL-ML": {}, "CL-NB": {}, "CL-RM": {}, + "CL-TA": {}, "CL-VS": {}, "CM-AD": {}, "CM-CE": {}, "CM-EN": {}, + "CM-ES": {}, "CM-LT": {}, "CM-NO": {}, "CM-NW": {}, "CM-OU": {}, + "CM-SU": {}, "CM-SW": {}, "CN-AH": {}, "CN-BJ": {}, "CN-CQ": {}, + "CN-FJ": {}, "CN-GS": {}, "CN-GD": {}, "CN-GX": {}, "CN-GZ": {}, + "CN-HI": {}, "CN-HE": {}, "CN-HL": {}, "CN-HA": {}, "CN-HB": {}, + "CN-HN": {}, "CN-JS": {}, "CN-JX": {}, "CN-JL": {}, "CN-LN": {}, + "CN-NM": {}, "CN-NX": {}, "CN-QH": {}, "CN-SN": {}, "CN-SD": {}, "CN-SH": {}, + "CN-SX": {}, "CN-SC": {}, "CN-TJ": {}, "CN-XJ": {}, "CN-XZ": {}, "CN-YN": {}, + "CN-ZJ": {}, "CO-AMA": {}, "CO-ANT": {}, "CO-ARA": {}, "CO-ATL": {}, + "CO-BOL": {}, "CO-BOY": {}, "CO-CAL": {}, "CO-CAQ": {}, "CO-CAS": {}, + "CO-CAU": {}, "CO-CES": {}, "CO-CHO": {}, "CO-COR": {}, "CO-CUN": {}, + "CO-DC": {}, "CO-GUA": {}, "CO-GUV": {}, "CO-HUI": {}, "CO-LAG": {}, + "CO-MAG": {}, "CO-MET": {}, "CO-NAR": {}, "CO-NSA": {}, "CO-PUT": {}, + "CO-QUI": {}, "CO-RIS": {}, "CO-SAN": {}, "CO-SAP": {}, "CO-SUC": {}, + "CO-TOL": {}, "CO-VAC": {}, "CO-VAU": {}, "CO-VID": {}, "CR-A": {}, + "CR-C": {}, "CR-G": {}, "CR-H": {}, "CR-L": {}, "CR-P": {}, + "CR-SJ": {}, "CU-01": {}, "CU-02": {}, "CU-03": {}, "CU-04": {}, + "CU-05": {}, "CU-06": {}, "CU-07": {}, "CU-08": {}, "CU-09": {}, + "CU-10": {}, "CU-11": {}, "CU-12": {}, "CU-13": {}, "CU-14": {}, "CU-15": {}, + "CU-16": {}, "CU-99": {}, "CV-B": {}, "CV-BR": {}, "CV-BV": {}, "CV-CA": {}, + "CV-CF": {}, "CV-CR": {}, "CV-MA": {}, "CV-MO": {}, "CV-PA": {}, + "CV-PN": {}, "CV-PR": {}, "CV-RB": {}, "CV-RG": {}, "CV-RS": {}, + "CV-S": {}, "CV-SD": {}, "CV-SF": {}, "CV-SL": {}, "CV-SM": {}, + "CV-SO": {}, "CV-SS": {}, "CV-SV": {}, "CV-TA": {}, "CV-TS": {}, + "CY-01": {}, "CY-02": {}, "CY-03": {}, "CY-04": {}, "CY-05": {}, + "CY-06": {}, "CZ-10": {}, "CZ-101": {}, "CZ-102": {}, "CZ-103": {}, + "CZ-104": {}, "CZ-105": {}, "CZ-106": {}, "CZ-107": {}, "CZ-108": {}, + "CZ-109": {}, "CZ-110": {}, "CZ-111": {}, "CZ-112": {}, "CZ-113": {}, + "CZ-114": {}, "CZ-115": {}, "CZ-116": {}, "CZ-117": {}, "CZ-118": {}, + "CZ-119": {}, "CZ-120": {}, "CZ-121": {}, "CZ-122": {}, "CZ-20": {}, + "CZ-201": {}, "CZ-202": {}, "CZ-203": {}, "CZ-204": {}, "CZ-205": {}, + "CZ-206": {}, "CZ-207": {}, "CZ-208": {}, "CZ-209": {}, "CZ-20A": {}, + "CZ-20B": {}, "CZ-20C": {}, "CZ-31": {}, "CZ-311": {}, "CZ-312": {}, + "CZ-313": {}, "CZ-314": {}, "CZ-315": {}, "CZ-316": {}, "CZ-317": {}, + "CZ-32": {}, "CZ-321": {}, "CZ-322": {}, "CZ-323": {}, "CZ-324": {}, + "CZ-325": {}, "CZ-326": {}, "CZ-327": {}, "CZ-41": {}, "CZ-411": {}, + "CZ-412": {}, "CZ-413": {}, "CZ-42": {}, "CZ-421": {}, "CZ-422": {}, + "CZ-423": {}, "CZ-424": {}, "CZ-425": {}, "CZ-426": {}, "CZ-427": {}, + "CZ-51": {}, "CZ-511": {}, "CZ-512": {}, "CZ-513": {}, "CZ-514": {}, + "CZ-52": {}, "CZ-521": {}, "CZ-522": {}, "CZ-523": {}, "CZ-524": {}, + "CZ-525": {}, "CZ-53": {}, "CZ-531": {}, "CZ-532": {}, "CZ-533": {}, + "CZ-534": {}, "CZ-63": {}, "CZ-631": {}, "CZ-632": {}, "CZ-633": {}, + "CZ-634": {}, "CZ-635": {}, "CZ-64": {}, "CZ-641": {}, "CZ-642": {}, + "CZ-643": {}, "CZ-644": {}, "CZ-645": {}, "CZ-646": {}, "CZ-647": {}, + "CZ-71": {}, "CZ-711": {}, "CZ-712": {}, "CZ-713": {}, "CZ-714": {}, + "CZ-715": {}, "CZ-72": {}, "CZ-721": {}, "CZ-722": {}, "CZ-723": {}, + "CZ-724": {}, "CZ-80": {}, "CZ-801": {}, "CZ-802": {}, "CZ-803": {}, + "CZ-804": {}, "CZ-805": {}, "CZ-806": {}, "DE-BB": {}, "DE-BE": {}, + "DE-BW": {}, "DE-BY": {}, "DE-HB": {}, "DE-HE": {}, "DE-HH": {}, + "DE-MV": {}, "DE-NI": {}, "DE-NW": {}, "DE-RP": {}, "DE-SH": {}, + "DE-SL": {}, "DE-SN": {}, "DE-ST": {}, "DE-TH": {}, "DJ-AR": {}, + "DJ-AS": {}, "DJ-DI": {}, "DJ-DJ": {}, "DJ-OB": {}, "DJ-TA": {}, + "DK-81": {}, "DK-82": {}, "DK-83": {}, "DK-84": {}, "DK-85": {}, + "DM-01": {}, "DM-02": {}, "DM-03": {}, "DM-04": {}, "DM-05": {}, + "DM-06": {}, "DM-07": {}, "DM-08": {}, "DM-09": {}, "DM-10": {}, + "DO-01": {}, "DO-02": {}, "DO-03": {}, "DO-04": {}, "DO-05": {}, + "DO-06": {}, "DO-07": {}, "DO-08": {}, "DO-09": {}, "DO-10": {}, + "DO-11": {}, "DO-12": {}, "DO-13": {}, "DO-14": {}, "DO-15": {}, + "DO-16": {}, "DO-17": {}, "DO-18": {}, "DO-19": {}, "DO-20": {}, + "DO-21": {}, "DO-22": {}, "DO-23": {}, "DO-24": {}, "DO-25": {}, + "DO-26": {}, "DO-27": {}, "DO-28": {}, "DO-29": {}, "DO-30": {}, "DO-31": {}, + "DZ-01": {}, "DZ-02": {}, "DZ-03": {}, "DZ-04": {}, "DZ-05": {}, + "DZ-06": {}, "DZ-07": {}, "DZ-08": {}, "DZ-09": {}, "DZ-10": {}, + "DZ-11": {}, "DZ-12": {}, "DZ-13": {}, "DZ-14": {}, "DZ-15": {}, + "DZ-16": {}, "DZ-17": {}, "DZ-18": {}, "DZ-19": {}, "DZ-20": {}, + "DZ-21": {}, "DZ-22": {}, "DZ-23": {}, "DZ-24": {}, "DZ-25": {}, + "DZ-26": {}, "DZ-27": {}, "DZ-28": {}, "DZ-29": {}, "DZ-30": {}, + "DZ-31": {}, "DZ-32": {}, "DZ-33": {}, "DZ-34": {}, "DZ-35": {}, + "DZ-36": {}, "DZ-37": {}, "DZ-38": {}, "DZ-39": {}, "DZ-40": {}, + "DZ-41": {}, "DZ-42": {}, "DZ-43": {}, "DZ-44": {}, "DZ-45": {}, + "DZ-46": {}, "DZ-47": {}, "DZ-48": {}, "DZ-49": {}, "DZ-51": {}, + "DZ-53": {}, "DZ-55": {}, "DZ-56": {}, "DZ-57": {}, "EC-A": {}, "EC-B": {}, + "EC-C": {}, "EC-D": {}, "EC-E": {}, "EC-F": {}, "EC-G": {}, + "EC-H": {}, "EC-I": {}, "EC-L": {}, "EC-M": {}, "EC-N": {}, + "EC-O": {}, "EC-P": {}, "EC-R": {}, "EC-S": {}, "EC-SD": {}, + "EC-SE": {}, "EC-T": {}, "EC-U": {}, "EC-W": {}, "EC-X": {}, + "EC-Y": {}, "EC-Z": {}, "EE-37": {}, "EE-39": {}, "EE-44": {}, "EE-45": {}, + "EE-49": {}, "EE-50": {}, "EE-51": {}, "EE-52": {}, "EE-56": {}, "EE-57": {}, + "EE-59": {}, "EE-60": {}, "EE-64": {}, "EE-65": {}, "EE-67": {}, "EE-68": {}, + "EE-70": {}, "EE-71": {}, "EE-74": {}, "EE-78": {}, "EE-79": {}, "EE-81": {}, "EE-82": {}, + "EE-84": {}, "EE-86": {}, "EE-87": {}, "EG-ALX": {}, "EG-ASN": {}, "EG-AST": {}, + "EG-BA": {}, "EG-BH": {}, "EG-BNS": {}, "EG-C": {}, "EG-DK": {}, + "EG-DT": {}, "EG-FYM": {}, "EG-GH": {}, "EG-GZ": {}, "EG-HU": {}, + "EG-IS": {}, "EG-JS": {}, "EG-KB": {}, "EG-KFS": {}, "EG-KN": {}, + "EG-LX": {}, "EG-MN": {}, "EG-MNF": {}, "EG-MT": {}, "EG-PTS": {}, "EG-SHG": {}, + "EG-SHR": {}, "EG-SIN": {}, "EG-SU": {}, "EG-SUZ": {}, "EG-WAD": {}, + "ER-AN": {}, "ER-DK": {}, "ER-DU": {}, "ER-GB": {}, "ER-MA": {}, + "ER-SK": {}, "ES-A": {}, "ES-AB": {}, "ES-AL": {}, "ES-AN": {}, + "ES-AR": {}, "ES-AS": {}, "ES-AV": {}, "ES-B": {}, "ES-BA": {}, + "ES-BI": {}, "ES-BU": {}, "ES-C": {}, "ES-CA": {}, "ES-CB": {}, + "ES-CC": {}, "ES-CE": {}, "ES-CL": {}, "ES-CM": {}, "ES-CN": {}, + "ES-CO": {}, "ES-CR": {}, "ES-CS": {}, "ES-CT": {}, "ES-CU": {}, + "ES-EX": {}, "ES-GA": {}, "ES-GC": {}, "ES-GI": {}, "ES-GR": {}, + "ES-GU": {}, "ES-H": {}, "ES-HU": {}, "ES-IB": {}, "ES-J": {}, + "ES-L": {}, "ES-LE": {}, "ES-LO": {}, "ES-LU": {}, "ES-M": {}, + "ES-MA": {}, "ES-MC": {}, "ES-MD": {}, "ES-ML": {}, "ES-MU": {}, + "ES-NA": {}, "ES-NC": {}, "ES-O": {}, "ES-OR": {}, "ES-P": {}, + "ES-PM": {}, "ES-PO": {}, "ES-PV": {}, "ES-RI": {}, "ES-S": {}, + "ES-SA": {}, "ES-SE": {}, "ES-SG": {}, "ES-SO": {}, "ES-SS": {}, + "ES-T": {}, "ES-TE": {}, "ES-TF": {}, "ES-TO": {}, "ES-V": {}, + "ES-VA": {}, "ES-VC": {}, "ES-VI": {}, "ES-Z": {}, "ES-ZA": {}, + "ET-AA": {}, "ET-AF": {}, "ET-AM": {}, "ET-BE": {}, "ET-DD": {}, + "ET-GA": {}, "ET-HA": {}, "ET-OR": {}, "ET-SN": {}, "ET-SO": {}, + "ET-TI": {}, "FI-01": {}, "FI-02": {}, "FI-03": {}, "FI-04": {}, + "FI-05": {}, "FI-06": {}, "FI-07": {}, "FI-08": {}, "FI-09": {}, + "FI-10": {}, "FI-11": {}, "FI-12": {}, "FI-13": {}, "FI-14": {}, + "FI-15": {}, "FI-16": {}, "FI-17": {}, "FI-18": {}, "FI-19": {}, + "FJ-C": {}, "FJ-E": {}, "FJ-N": {}, "FJ-R": {}, "FJ-W": {}, + "FM-KSA": {}, "FM-PNI": {}, "FM-TRK": {}, "FM-YAP": {}, "FR-01": {}, + "FR-02": {}, "FR-03": {}, "FR-04": {}, "FR-05": {}, "FR-06": {}, + "FR-07": {}, "FR-08": {}, "FR-09": {}, "FR-10": {}, "FR-11": {}, + "FR-12": {}, "FR-13": {}, "FR-14": {}, "FR-15": {}, "FR-16": {}, + "FR-17": {}, "FR-18": {}, "FR-19": {}, "FR-20R": {}, "FR-21": {}, "FR-22": {}, + "FR-23": {}, "FR-24": {}, "FR-25": {}, "FR-26": {}, "FR-27": {}, + "FR-28": {}, "FR-29": {}, "FR-2A": {}, "FR-2B": {}, "FR-30": {}, + "FR-31": {}, "FR-32": {}, "FR-33": {}, "FR-34": {}, "FR-35": {}, + "FR-36": {}, "FR-37": {}, "FR-38": {}, "FR-39": {}, "FR-40": {}, + "FR-41": {}, "FR-42": {}, "FR-43": {}, "FR-44": {}, "FR-45": {}, + "FR-46": {}, "FR-47": {}, "FR-48": {}, "FR-49": {}, "FR-50": {}, + "FR-51": {}, "FR-52": {}, "FR-53": {}, "FR-54": {}, "FR-55": {}, + "FR-56": {}, "FR-57": {}, "FR-58": {}, "FR-59": {}, "FR-60": {}, + "FR-61": {}, "FR-62": {}, "FR-63": {}, "FR-64": {}, "FR-65": {}, + "FR-66": {}, "FR-67": {}, "FR-68": {}, "FR-69": {}, "FR-70": {}, + "FR-71": {}, "FR-72": {}, "FR-73": {}, "FR-74": {}, "FR-75": {}, + "FR-76": {}, "FR-77": {}, "FR-78": {}, "FR-79": {}, "FR-80": {}, + "FR-81": {}, "FR-82": {}, "FR-83": {}, "FR-84": {}, "FR-85": {}, + "FR-86": {}, "FR-87": {}, "FR-88": {}, "FR-89": {}, "FR-90": {}, + "FR-91": {}, "FR-92": {}, "FR-93": {}, "FR-94": {}, "FR-95": {}, + "FR-ARA": {}, "FR-BFC": {}, "FR-BL": {}, "FR-BRE": {}, "FR-COR": {}, + "FR-CP": {}, "FR-CVL": {}, "FR-GES": {}, "FR-GF": {}, "FR-GP": {}, + "FR-GUA": {}, "FR-HDF": {}, "FR-IDF": {}, "FR-LRE": {}, "FR-MAY": {}, + "FR-MF": {}, "FR-MQ": {}, "FR-NAQ": {}, "FR-NC": {}, "FR-NOR": {}, + "FR-OCC": {}, "FR-PAC": {}, "FR-PDL": {}, "FR-PF": {}, "FR-PM": {}, + "FR-RE": {}, "FR-TF": {}, "FR-WF": {}, "FR-YT": {}, "GA-1": {}, + "GA-2": {}, "GA-3": {}, "GA-4": {}, "GA-5": {}, "GA-6": {}, + "GA-7": {}, "GA-8": {}, "GA-9": {}, "GB-ABC": {}, "GB-ABD": {}, + "GB-ABE": {}, "GB-AGB": {}, "GB-AGY": {}, "GB-AND": {}, "GB-ANN": {}, + "GB-ANS": {}, "GB-BAS": {}, "GB-BBD": {}, "GB-BDF": {}, "GB-BDG": {}, + "GB-BEN": {}, "GB-BEX": {}, "GB-BFS": {}, "GB-BGE": {}, "GB-BGW": {}, + "GB-BIR": {}, "GB-BKM": {}, "GB-BMH": {}, "GB-BNE": {}, "GB-BNH": {}, + "GB-BNS": {}, "GB-BOL": {}, "GB-BPL": {}, "GB-BRC": {}, "GB-BRD": {}, + "GB-BRY": {}, "GB-BST": {}, "GB-BUR": {}, "GB-CAM": {}, "GB-CAY": {}, + "GB-CBF": {}, "GB-CCG": {}, "GB-CGN": {}, "GB-CHE": {}, "GB-CHW": {}, + "GB-CLD": {}, "GB-CLK": {}, "GB-CMA": {}, "GB-CMD": {}, "GB-CMN": {}, + "GB-CON": {}, "GB-COV": {}, "GB-CRF": {}, "GB-CRY": {}, "GB-CWY": {}, + "GB-DAL": {}, "GB-DBY": {}, "GB-DEN": {}, "GB-DER": {}, "GB-DEV": {}, + "GB-DGY": {}, "GB-DNC": {}, "GB-DND": {}, "GB-DOR": {}, "GB-DRS": {}, + "GB-DUD": {}, "GB-DUR": {}, "GB-EAL": {}, "GB-EAW": {}, "GB-EAY": {}, + "GB-EDH": {}, "GB-EDU": {}, "GB-ELN": {}, "GB-ELS": {}, "GB-ENF": {}, + "GB-ENG": {}, "GB-ERW": {}, "GB-ERY": {}, "GB-ESS": {}, "GB-ESX": {}, + "GB-FAL": {}, "GB-FIF": {}, "GB-FLN": {}, "GB-FMO": {}, "GB-GAT": {}, + "GB-GBN": {}, "GB-GLG": {}, "GB-GLS": {}, "GB-GRE": {}, "GB-GWN": {}, + "GB-HAL": {}, "GB-HAM": {}, "GB-HAV": {}, "GB-HCK": {}, "GB-HEF": {}, + "GB-HIL": {}, "GB-HLD": {}, "GB-HMF": {}, "GB-HNS": {}, "GB-HPL": {}, + "GB-HRT": {}, "GB-HRW": {}, "GB-HRY": {}, "GB-IOS": {}, "GB-IOW": {}, + "GB-ISL": {}, "GB-IVC": {}, "GB-KEC": {}, "GB-KEN": {}, "GB-KHL": {}, + "GB-KIR": {}, "GB-KTT": {}, "GB-KWL": {}, "GB-LAN": {}, "GB-LBC": {}, + "GB-LBH": {}, "GB-LCE": {}, "GB-LDS": {}, "GB-LEC": {}, "GB-LEW": {}, + "GB-LIN": {}, "GB-LIV": {}, "GB-LND": {}, "GB-LUT": {}, "GB-MAN": {}, + "GB-MDB": {}, "GB-MDW": {}, "GB-MEA": {}, "GB-MIK": {}, "GD-01": {}, + "GB-MLN": {}, "GB-MON": {}, "GB-MRT": {}, "GB-MRY": {}, "GB-MTY": {}, + "GB-MUL": {}, "GB-NAY": {}, "GB-NBL": {}, "GB-NEL": {}, "GB-NET": {}, + "GB-NFK": {}, "GB-NGM": {}, "GB-NIR": {}, "GB-NLK": {}, "GB-NLN": {}, + "GB-NMD": {}, "GB-NSM": {}, "GB-NTH": {}, "GB-NTL": {}, "GB-NTT": {}, + "GB-NTY": {}, "GB-NWM": {}, "GB-NWP": {}, "GB-NYK": {}, "GB-OLD": {}, + "GB-ORK": {}, "GB-OXF": {}, "GB-PEM": {}, "GB-PKN": {}, "GB-PLY": {}, + "GB-POL": {}, "GB-POR": {}, "GB-POW": {}, "GB-PTE": {}, "GB-RCC": {}, + "GB-RCH": {}, "GB-RCT": {}, "GB-RDB": {}, "GB-RDG": {}, "GB-RFW": {}, + "GB-RIC": {}, "GB-ROT": {}, "GB-RUT": {}, "GB-SAW": {}, "GB-SAY": {}, + "GB-SCB": {}, "GB-SCT": {}, "GB-SFK": {}, "GB-SFT": {}, "GB-SGC": {}, + "GB-SHF": {}, "GB-SHN": {}, "GB-SHR": {}, "GB-SKP": {}, "GB-SLF": {}, + "GB-SLG": {}, "GB-SLK": {}, "GB-SND": {}, "GB-SOL": {}, "GB-SOM": {}, + "GB-SOS": {}, "GB-SRY": {}, "GB-STE": {}, "GB-STG": {}, "GB-STH": {}, + "GB-STN": {}, "GB-STS": {}, "GB-STT": {}, "GB-STY": {}, "GB-SWA": {}, + "GB-SWD": {}, "GB-SWK": {}, "GB-TAM": {}, "GB-TFW": {}, "GB-THR": {}, + "GB-TOB": {}, "GB-TOF": {}, "GB-TRF": {}, "GB-TWH": {}, "GB-UKM": {}, + "GB-VGL": {}, "GB-WAR": {}, "GB-WBK": {}, "GB-WDU": {}, "GB-WFT": {}, + "GB-WGN": {}, "GB-WIL": {}, "GB-WKF": {}, "GB-WLL": {}, "GB-WLN": {}, + "GB-WLS": {}, "GB-WLV": {}, "GB-WND": {}, "GB-WNM": {}, "GB-WOK": {}, + "GB-WOR": {}, "GB-WRL": {}, "GB-WRT": {}, "GB-WRX": {}, "GB-WSM": {}, + "GB-WSX": {}, "GB-YOR": {}, "GB-ZET": {}, "GD-02": {}, "GD-03": {}, + "GD-04": {}, "GD-05": {}, "GD-06": {}, "GD-10": {}, "GE-AB": {}, + "GE-AJ": {}, "GE-GU": {}, "GE-IM": {}, "GE-KA": {}, "GE-KK": {}, + "GE-MM": {}, "GE-RL": {}, "GE-SJ": {}, "GE-SK": {}, "GE-SZ": {}, + "GE-TB": {}, "GH-AA": {}, "GH-AH": {}, "GH-AF": {}, "GH-BA": {}, "GH-BO": {}, "GH-BE": {}, "GH-CP": {}, + "GH-EP": {}, "GH-NP": {}, "GH-TV": {}, "GH-UE": {}, "GH-UW": {}, + "GH-WP": {}, "GL-AV": {}, "GL-KU": {}, "GL-QA": {}, "GL-QT": {}, "GL-QE": {}, "GL-SM": {}, + "GM-B": {}, "GM-L": {}, "GM-M": {}, "GM-N": {}, "GM-U": {}, + "GM-W": {}, "GN-B": {}, "GN-BE": {}, "GN-BF": {}, "GN-BK": {}, + "GN-C": {}, "GN-CO": {}, "GN-D": {}, "GN-DB": {}, "GN-DI": {}, + "GN-DL": {}, "GN-DU": {}, "GN-F": {}, "GN-FA": {}, "GN-FO": {}, + "GN-FR": {}, "GN-GA": {}, "GN-GU": {}, "GN-K": {}, "GN-KA": {}, + "GN-KB": {}, "GN-KD": {}, "GN-KE": {}, "GN-KN": {}, "GN-KO": {}, + "GN-KS": {}, "GN-L": {}, "GN-LA": {}, "GN-LE": {}, "GN-LO": {}, + "GN-M": {}, "GN-MC": {}, "GN-MD": {}, "GN-ML": {}, "GN-MM": {}, + "GN-N": {}, "GN-NZ": {}, "GN-PI": {}, "GN-SI": {}, "GN-TE": {}, + "GN-TO": {}, "GN-YO": {}, "GQ-AN": {}, "GQ-BN": {}, "GQ-BS": {}, + "GQ-C": {}, "GQ-CS": {}, "GQ-I": {}, "GQ-KN": {}, "GQ-LI": {}, + "GQ-WN": {}, "GR-01": {}, "GR-03": {}, "GR-04": {}, "GR-05": {}, + "GR-06": {}, "GR-07": {}, "GR-11": {}, "GR-12": {}, "GR-13": {}, + "GR-14": {}, "GR-15": {}, "GR-16": {}, "GR-17": {}, "GR-21": {}, + "GR-22": {}, "GR-23": {}, "GR-24": {}, "GR-31": {}, "GR-32": {}, + "GR-33": {}, "GR-34": {}, "GR-41": {}, "GR-42": {}, "GR-43": {}, + "GR-44": {}, "GR-51": {}, "GR-52": {}, "GR-53": {}, "GR-54": {}, + "GR-55": {}, "GR-56": {}, "GR-57": {}, "GR-58": {}, "GR-59": {}, + "GR-61": {}, "GR-62": {}, "GR-63": {}, "GR-64": {}, "GR-69": {}, + "GR-71": {}, "GR-72": {}, "GR-73": {}, "GR-81": {}, "GR-82": {}, + "GR-83": {}, "GR-84": {}, "GR-85": {}, "GR-91": {}, "GR-92": {}, + "GR-93": {}, "GR-94": {}, "GR-A": {}, "GR-A1": {}, "GR-B": {}, + "GR-C": {}, "GR-D": {}, "GR-E": {}, "GR-F": {}, "GR-G": {}, + "GR-H": {}, "GR-I": {}, "GR-J": {}, "GR-K": {}, "GR-L": {}, + "GR-M": {}, "GT-01": {}, "GT-02": {}, "GT-03": {}, "GT-04": {}, + "GT-05": {}, "GT-06": {}, "GT-07": {}, "GT-08": {}, "GT-09": {}, + "GT-10": {}, "GT-11": {}, "GT-12": {}, "GT-13": {}, "GT-14": {}, + "GT-15": {}, "GT-16": {}, "GT-17": {}, "GT-18": {}, "GT-19": {}, + "GT-20": {}, "GT-21": {}, "GT-22": {}, "GW-BA": {}, "GW-BL": {}, + "GW-BM": {}, "GW-BS": {}, "GW-CA": {}, "GW-GA": {}, "GW-L": {}, + "GW-N": {}, "GW-OI": {}, "GW-QU": {}, "GW-S": {}, "GW-TO": {}, + "GY-BA": {}, "GY-CU": {}, "GY-DE": {}, "GY-EB": {}, "GY-ES": {}, + "GY-MA": {}, "GY-PM": {}, "GY-PT": {}, "GY-UD": {}, "GY-UT": {}, + "HN-AT": {}, "HN-CH": {}, "HN-CL": {}, "HN-CM": {}, "HN-CP": {}, + "HN-CR": {}, "HN-EP": {}, "HN-FM": {}, "HN-GD": {}, "HN-IB": {}, + "HN-IN": {}, "HN-LE": {}, "HN-LP": {}, "HN-OC": {}, "HN-OL": {}, + "HN-SB": {}, "HN-VA": {}, "HN-YO": {}, "HR-01": {}, "HR-02": {}, + "HR-03": {}, "HR-04": {}, "HR-05": {}, "HR-06": {}, "HR-07": {}, + "HR-08": {}, "HR-09": {}, "HR-10": {}, "HR-11": {}, "HR-12": {}, + "HR-13": {}, "HR-14": {}, "HR-15": {}, "HR-16": {}, "HR-17": {}, + "HR-18": {}, "HR-19": {}, "HR-20": {}, "HR-21": {}, "HT-AR": {}, + "HT-CE": {}, "HT-GA": {}, "HT-ND": {}, "HT-NE": {}, "HT-NO": {}, "HT-NI": {}, + "HT-OU": {}, "HT-SD": {}, "HT-SE": {}, "HU-BA": {}, "HU-BC": {}, + "HU-BE": {}, "HU-BK": {}, "HU-BU": {}, "HU-BZ": {}, "HU-CS": {}, + "HU-DE": {}, "HU-DU": {}, "HU-EG": {}, "HU-ER": {}, "HU-FE": {}, + "HU-GS": {}, "HU-GY": {}, "HU-HB": {}, "HU-HE": {}, "HU-HV": {}, + "HU-JN": {}, "HU-KE": {}, "HU-KM": {}, "HU-KV": {}, "HU-MI": {}, + "HU-NK": {}, "HU-NO": {}, "HU-NY": {}, "HU-PE": {}, "HU-PS": {}, + "HU-SD": {}, "HU-SF": {}, "HU-SH": {}, "HU-SK": {}, "HU-SN": {}, + "HU-SO": {}, "HU-SS": {}, "HU-ST": {}, "HU-SZ": {}, "HU-TB": {}, + "HU-TO": {}, "HU-VA": {}, "HU-VE": {}, "HU-VM": {}, "HU-ZA": {}, + "HU-ZE": {}, "ID-AC": {}, "ID-BA": {}, "ID-BB": {}, "ID-BE": {}, + "ID-BT": {}, "ID-GO": {}, "ID-IJ": {}, "ID-JA": {}, "ID-JB": {}, + "ID-JI": {}, "ID-JK": {}, "ID-JT": {}, "ID-JW": {}, "ID-KA": {}, + "ID-KB": {}, "ID-KI": {}, "ID-KU": {}, "ID-KR": {}, "ID-KS": {}, + "ID-KT": {}, "ID-LA": {}, "ID-MA": {}, "ID-ML": {}, "ID-MU": {}, + "ID-NB": {}, "ID-NT": {}, "ID-NU": {}, "ID-PA": {}, "ID-PB": {}, + "ID-PE": {}, "ID-PP": {}, "ID-PS": {}, "ID-PT": {}, "ID-RI": {}, + "ID-SA": {}, "ID-SB": {}, "ID-SG": {}, "ID-SL": {}, "ID-SM": {}, + "ID-SN": {}, "ID-SR": {}, "ID-SS": {}, "ID-ST": {}, "ID-SU": {}, + "ID-YO": {}, "IE-C": {}, "IE-CE": {}, "IE-CN": {}, "IE-CO": {}, + "IE-CW": {}, "IE-D": {}, "IE-DL": {}, "IE-G": {}, "IE-KE": {}, + "IE-KK": {}, "IE-KY": {}, "IE-L": {}, "IE-LD": {}, "IE-LH": {}, + "IE-LK": {}, "IE-LM": {}, "IE-LS": {}, "IE-M": {}, "IE-MH": {}, + "IE-MN": {}, "IE-MO": {}, "IE-OY": {}, "IE-RN": {}, "IE-SO": {}, + "IE-TA": {}, "IE-U": {}, "IE-WD": {}, "IE-WH": {}, "IE-WW": {}, + "IE-WX": {}, "IL-D": {}, "IL-HA": {}, "IL-JM": {}, "IL-M": {}, + "IL-TA": {}, "IL-Z": {}, "IN-AN": {}, "IN-AP": {}, "IN-AR": {}, + "IN-AS": {}, "IN-BR": {}, "IN-CH": {}, "IN-CT": {}, "IN-DH": {}, + "IN-DL": {}, "IN-DN": {}, "IN-GA": {}, "IN-GJ": {}, "IN-HP": {}, + "IN-HR": {}, "IN-JH": {}, "IN-JK": {}, "IN-KA": {}, "IN-KL": {}, + "IN-LD": {}, "IN-MH": {}, "IN-ML": {}, "IN-MN": {}, "IN-MP": {}, + "IN-MZ": {}, "IN-NL": {}, "IN-TG": {}, "IN-OR": {}, "IN-PB": {}, "IN-PY": {}, + "IN-RJ": {}, "IN-SK": {}, "IN-TN": {}, "IN-TR": {}, "IN-UP": {}, + "IN-UT": {}, "IN-WB": {}, "IQ-AN": {}, "IQ-AR": {}, "IQ-BA": {}, + "IQ-BB": {}, "IQ-BG": {}, "IQ-DA": {}, "IQ-DI": {}, "IQ-DQ": {}, + "IQ-KA": {}, "IQ-KI": {}, "IQ-MA": {}, "IQ-MU": {}, "IQ-NA": {}, "IQ-NI": {}, + "IQ-QA": {}, "IQ-SD": {}, "IQ-SW": {}, "IQ-SU": {}, "IQ-TS": {}, "IQ-WA": {}, + "IR-00": {}, "IR-01": {}, "IR-02": {}, "IR-03": {}, "IR-04": {}, "IR-05": {}, + "IR-06": {}, "IR-07": {}, "IR-08": {}, "IR-09": {}, "IR-10": {}, "IR-11": {}, + "IR-12": {}, "IR-13": {}, "IR-14": {}, "IR-15": {}, "IR-16": {}, + "IR-17": {}, "IR-18": {}, "IR-19": {}, "IR-20": {}, "IR-21": {}, + "IR-22": {}, "IR-23": {}, "IR-24": {}, "IR-25": {}, "IR-26": {}, + "IR-27": {}, "IR-28": {}, "IR-29": {}, "IR-30": {}, "IR-31": {}, + "IS-0": {}, "IS-1": {}, "IS-2": {}, "IS-3": {}, "IS-4": {}, + "IS-5": {}, "IS-6": {}, "IS-7": {}, "IS-8": {}, "IT-21": {}, + "IT-23": {}, "IT-25": {}, "IT-32": {}, "IT-34": {}, "IT-36": {}, + "IT-42": {}, "IT-45": {}, "IT-52": {}, "IT-55": {}, "IT-57": {}, + "IT-62": {}, "IT-65": {}, "IT-67": {}, "IT-72": {}, "IT-75": {}, + "IT-77": {}, "IT-78": {}, "IT-82": {}, "IT-88": {}, "IT-AG": {}, + "IT-AL": {}, "IT-AN": {}, "IT-AO": {}, "IT-AP": {}, "IT-AQ": {}, + "IT-AR": {}, "IT-AT": {}, "IT-AV": {}, "IT-BA": {}, "IT-BG": {}, + "IT-BI": {}, "IT-BL": {}, "IT-BN": {}, "IT-BO": {}, "IT-BR": {}, + "IT-BS": {}, "IT-BT": {}, "IT-BZ": {}, "IT-CA": {}, "IT-CB": {}, + "IT-CE": {}, "IT-CH": {}, "IT-CI": {}, "IT-CL": {}, "IT-CN": {}, + "IT-CO": {}, "IT-CR": {}, "IT-CS": {}, "IT-CT": {}, "IT-CZ": {}, + "IT-EN": {}, "IT-FC": {}, "IT-FE": {}, "IT-FG": {}, "IT-FI": {}, + "IT-FM": {}, "IT-FR": {}, "IT-GE": {}, "IT-GO": {}, "IT-GR": {}, + "IT-IM": {}, "IT-IS": {}, "IT-KR": {}, "IT-LC": {}, "IT-LE": {}, + "IT-LI": {}, "IT-LO": {}, "IT-LT": {}, "IT-LU": {}, "IT-MB": {}, + "IT-MC": {}, "IT-ME": {}, "IT-MI": {}, "IT-MN": {}, "IT-MO": {}, + "IT-MS": {}, "IT-MT": {}, "IT-NA": {}, "IT-NO": {}, "IT-NU": {}, + "IT-OG": {}, "IT-OR": {}, "IT-OT": {}, "IT-PA": {}, "IT-PC": {}, + "IT-PD": {}, "IT-PE": {}, "IT-PG": {}, "IT-PI": {}, "IT-PN": {}, + "IT-PO": {}, "IT-PR": {}, "IT-PT": {}, "IT-PU": {}, "IT-PV": {}, + "IT-PZ": {}, "IT-RA": {}, "IT-RC": {}, "IT-RE": {}, "IT-RG": {}, + "IT-RI": {}, "IT-RM": {}, "IT-RN": {}, "IT-RO": {}, "IT-SA": {}, + "IT-SI": {}, "IT-SO": {}, "IT-SP": {}, "IT-SR": {}, "IT-SS": {}, + "IT-SV": {}, "IT-TA": {}, "IT-TE": {}, "IT-TN": {}, "IT-TO": {}, + "IT-TP": {}, "IT-TR": {}, "IT-TS": {}, "IT-TV": {}, "IT-UD": {}, + "IT-VA": {}, "IT-VB": {}, "IT-VC": {}, "IT-VE": {}, "IT-VI": {}, + "IT-VR": {}, "IT-VS": {}, "IT-VT": {}, "IT-VV": {}, "JM-01": {}, + "JM-02": {}, "JM-03": {}, "JM-04": {}, "JM-05": {}, "JM-06": {}, + "JM-07": {}, "JM-08": {}, "JM-09": {}, "JM-10": {}, "JM-11": {}, + "JM-12": {}, "JM-13": {}, "JM-14": {}, "JO-AJ": {}, "JO-AM": {}, + "JO-AQ": {}, "JO-AT": {}, "JO-AZ": {}, "JO-BA": {}, "JO-IR": {}, + "JO-JA": {}, "JO-KA": {}, "JO-MA": {}, "JO-MD": {}, "JO-MN": {}, + "JP-01": {}, "JP-02": {}, "JP-03": {}, "JP-04": {}, "JP-05": {}, + "JP-06": {}, "JP-07": {}, "JP-08": {}, "JP-09": {}, "JP-10": {}, + "JP-11": {}, "JP-12": {}, "JP-13": {}, "JP-14": {}, "JP-15": {}, + "JP-16": {}, "JP-17": {}, "JP-18": {}, "JP-19": {}, "JP-20": {}, + "JP-21": {}, "JP-22": {}, "JP-23": {}, "JP-24": {}, "JP-25": {}, + "JP-26": {}, "JP-27": {}, "JP-28": {}, "JP-29": {}, "JP-30": {}, + "JP-31": {}, "JP-32": {}, "JP-33": {}, "JP-34": {}, "JP-35": {}, + "JP-36": {}, "JP-37": {}, "JP-38": {}, "JP-39": {}, "JP-40": {}, + "JP-41": {}, "JP-42": {}, "JP-43": {}, "JP-44": {}, "JP-45": {}, + "JP-46": {}, "JP-47": {}, "KE-01": {}, "KE-02": {}, "KE-03": {}, + "KE-04": {}, "KE-05": {}, "KE-06": {}, "KE-07": {}, "KE-08": {}, + "KE-09": {}, "KE-10": {}, "KE-11": {}, "KE-12": {}, "KE-13": {}, + "KE-14": {}, "KE-15": {}, "KE-16": {}, "KE-17": {}, "KE-18": {}, + "KE-19": {}, "KE-20": {}, "KE-21": {}, "KE-22": {}, "KE-23": {}, + "KE-24": {}, "KE-25": {}, "KE-26": {}, "KE-27": {}, "KE-28": {}, + "KE-29": {}, "KE-30": {}, "KE-31": {}, "KE-32": {}, "KE-33": {}, + "KE-34": {}, "KE-35": {}, "KE-36": {}, "KE-37": {}, "KE-38": {}, + "KE-39": {}, "KE-40": {}, "KE-41": {}, "KE-42": {}, "KE-43": {}, + "KE-44": {}, "KE-45": {}, "KE-46": {}, "KE-47": {}, "KG-B": {}, + "KG-C": {}, "KG-GB": {}, "KG-GO": {}, "KG-J": {}, "KG-N": {}, "KG-O": {}, + "KG-T": {}, "KG-Y": {}, "KH-1": {}, "KH-10": {}, "KH-11": {}, + "KH-12": {}, "KH-13": {}, "KH-14": {}, "KH-15": {}, "KH-16": {}, + "KH-17": {}, "KH-18": {}, "KH-19": {}, "KH-2": {}, "KH-20": {}, + "KH-21": {}, "KH-22": {}, "KH-23": {}, "KH-24": {}, "KH-3": {}, + "KH-4": {}, "KH-5": {}, "KH-6": {}, "KH-7": {}, "KH-8": {}, + "KH-9": {}, "KI-G": {}, "KI-L": {}, "KI-P": {}, "KM-A": {}, + "KM-G": {}, "KM-M": {}, "KN-01": {}, "KN-02": {}, "KN-03": {}, + "KN-04": {}, "KN-05": {}, "KN-06": {}, "KN-07": {}, "KN-08": {}, + "KN-09": {}, "KN-10": {}, "KN-11": {}, "KN-12": {}, "KN-13": {}, + "KN-15": {}, "KN-K": {}, "KN-N": {}, "KP-01": {}, "KP-02": {}, + "KP-03": {}, "KP-04": {}, "KP-05": {}, "KP-06": {}, "KP-07": {}, + "KP-08": {}, "KP-09": {}, "KP-10": {}, "KP-13": {}, "KR-11": {}, + "KR-26": {}, "KR-27": {}, "KR-28": {}, "KR-29": {}, "KR-30": {}, + "KR-31": {}, "KR-41": {}, "KR-42": {}, "KR-43": {}, "KR-44": {}, + "KR-45": {}, "KR-46": {}, "KR-47": {}, "KR-48": {}, "KR-49": {}, + "KW-AH": {}, "KW-FA": {}, "KW-HA": {}, "KW-JA": {}, "KW-KU": {}, + "KW-MU": {}, "KZ-10": {}, "KZ-75": {}, "KZ-19": {}, "KZ-11": {}, + "KZ-15": {}, "KZ-71": {}, "KZ-23": {}, "KZ-27": {}, "KZ-47": {}, + "KZ-55": {}, "KZ-35": {}, "KZ-39": {}, "KZ-43": {}, "KZ-63": {}, + "KZ-79": {}, "KZ-59": {}, "KZ-61": {}, "KZ-62": {}, "KZ-31": {}, + "KZ-33": {}, "LA-AT": {}, "LA-BK": {}, "LA-BL": {}, + "LA-CH": {}, "LA-HO": {}, "LA-KH": {}, "LA-LM": {}, "LA-LP": {}, + "LA-OU": {}, "LA-PH": {}, "LA-SL": {}, "LA-SV": {}, "LA-VI": {}, + "LA-VT": {}, "LA-XA": {}, "LA-XE": {}, "LA-XI": {}, "LA-XS": {}, + "LB-AK": {}, "LB-AS": {}, "LB-BA": {}, "LB-BH": {}, "LB-BI": {}, + "LB-JA": {}, "LB-JL": {}, "LB-NA": {}, "LC-01": {}, "LC-02": {}, + "LC-03": {}, "LC-05": {}, "LC-06": {}, "LC-07": {}, "LC-08": {}, + "LC-10": {}, "LC-11": {}, "LI-01": {}, "LI-02": {}, + "LI-03": {}, "LI-04": {}, "LI-05": {}, "LI-06": {}, "LI-07": {}, + "LI-08": {}, "LI-09": {}, "LI-10": {}, "LI-11": {}, "LK-1": {}, + "LK-11": {}, "LK-12": {}, "LK-13": {}, "LK-2": {}, "LK-21": {}, + "LK-22": {}, "LK-23": {}, "LK-3": {}, "LK-31": {}, "LK-32": {}, + "LK-33": {}, "LK-4": {}, "LK-41": {}, "LK-42": {}, "LK-43": {}, + "LK-44": {}, "LK-45": {}, "LK-5": {}, "LK-51": {}, "LK-52": {}, + "LK-53": {}, "LK-6": {}, "LK-61": {}, "LK-62": {}, "LK-7": {}, + "LK-71": {}, "LK-72": {}, "LK-8": {}, "LK-81": {}, "LK-82": {}, + "LK-9": {}, "LK-91": {}, "LK-92": {}, "LR-BG": {}, "LR-BM": {}, + "LR-CM": {}, "LR-GB": {}, "LR-GG": {}, "LR-GK": {}, "LR-LO": {}, + "LR-MG": {}, "LR-MO": {}, "LR-MY": {}, "LR-NI": {}, "LR-RI": {}, + "LR-SI": {}, "LS-A": {}, "LS-B": {}, "LS-C": {}, "LS-D": {}, + "LS-E": {}, "LS-F": {}, "LS-G": {}, "LS-H": {}, "LS-J": {}, + "LS-K": {}, "LT-AL": {}, "LT-KL": {}, "LT-KU": {}, "LT-MR": {}, + "LT-PN": {}, "LT-SA": {}, "LT-TA": {}, "LT-TE": {}, "LT-UT": {}, + "LT-VL": {}, "LU-CA": {}, "LU-CL": {}, "LU-DI": {}, "LU-EC": {}, + "LU-ES": {}, "LU-GR": {}, "LU-LU": {}, "LU-ME": {}, "LU-RD": {}, + "LU-RM": {}, "LU-VD": {}, "LU-WI": {}, "LU-D": {}, "LU-G": {}, "LU-L": {}, + "LV-001": {}, "LV-111": {}, "LV-112": {}, "LV-113": {}, + "LV-002": {}, "LV-003": {}, "LV-004": {}, "LV-005": {}, "LV-006": {}, + "LV-007": {}, "LV-008": {}, "LV-009": {}, "LV-010": {}, "LV-011": {}, + "LV-012": {}, "LV-013": {}, "LV-014": {}, "LV-015": {}, "LV-016": {}, + "LV-017": {}, "LV-018": {}, "LV-019": {}, "LV-020": {}, "LV-021": {}, + "LV-022": {}, "LV-023": {}, "LV-024": {}, "LV-025": {}, "LV-026": {}, + "LV-027": {}, "LV-028": {}, "LV-029": {}, "LV-030": {}, "LV-031": {}, + "LV-032": {}, "LV-033": {}, "LV-034": {}, "LV-035": {}, "LV-036": {}, + "LV-037": {}, "LV-038": {}, "LV-039": {}, "LV-040": {}, "LV-041": {}, + "LV-042": {}, "LV-043": {}, "LV-044": {}, "LV-045": {}, "LV-046": {}, + "LV-047": {}, "LV-048": {}, "LV-049": {}, "LV-050": {}, "LV-051": {}, + "LV-052": {}, "LV-053": {}, "LV-054": {}, "LV-055": {}, "LV-056": {}, + "LV-057": {}, "LV-058": {}, "LV-059": {}, "LV-060": {}, "LV-061": {}, + "LV-062": {}, "LV-063": {}, "LV-064": {}, "LV-065": {}, "LV-066": {}, + "LV-067": {}, "LV-068": {}, "LV-069": {}, "LV-070": {}, "LV-071": {}, + "LV-072": {}, "LV-073": {}, "LV-074": {}, "LV-075": {}, "LV-076": {}, + "LV-077": {}, "LV-078": {}, "LV-079": {}, "LV-080": {}, "LV-081": {}, + "LV-082": {}, "LV-083": {}, "LV-084": {}, "LV-085": {}, "LV-086": {}, + "LV-087": {}, "LV-088": {}, "LV-089": {}, "LV-090": {}, "LV-091": {}, + "LV-092": {}, "LV-093": {}, "LV-094": {}, "LV-095": {}, "LV-096": {}, + "LV-097": {}, "LV-098": {}, "LV-099": {}, "LV-100": {}, "LV-101": {}, + "LV-102": {}, "LV-103": {}, "LV-104": {}, "LV-105": {}, "LV-106": {}, + "LV-107": {}, "LV-108": {}, "LV-109": {}, "LV-110": {}, "LV-DGV": {}, + "LV-JEL": {}, "LV-JKB": {}, "LV-JUR": {}, "LV-LPX": {}, "LV-REZ": {}, + "LV-RIX": {}, "LV-VEN": {}, "LV-VMR": {}, "LY-BA": {}, "LY-BU": {}, + "LY-DR": {}, "LY-GT": {}, "LY-JA": {}, "LY-JB": {}, "LY-JG": {}, + "LY-JI": {}, "LY-JU": {}, "LY-KF": {}, "LY-MB": {}, "LY-MI": {}, + "LY-MJ": {}, "LY-MQ": {}, "LY-NL": {}, "LY-NQ": {}, "LY-SB": {}, + "LY-SR": {}, "LY-TB": {}, "LY-WA": {}, "LY-WD": {}, "LY-WS": {}, + "LY-ZA": {}, "MA-01": {}, "MA-02": {}, "MA-03": {}, "MA-04": {}, + "MA-05": {}, "MA-06": {}, "MA-07": {}, "MA-08": {}, "MA-09": {}, + "MA-10": {}, "MA-11": {}, "MA-12": {}, "MA-13": {}, "MA-14": {}, + "MA-15": {}, "MA-16": {}, "MA-AGD": {}, "MA-AOU": {}, "MA-ASZ": {}, + "MA-AZI": {}, "MA-BEM": {}, "MA-BER": {}, "MA-BES": {}, "MA-BOD": {}, + "MA-BOM": {}, "MA-CAS": {}, "MA-CHE": {}, "MA-CHI": {}, "MA-CHT": {}, + "MA-ERR": {}, "MA-ESI": {}, "MA-ESM": {}, "MA-FAH": {}, "MA-FES": {}, + "MA-FIG": {}, "MA-GUE": {}, "MA-HAJ": {}, "MA-HAO": {}, "MA-HOC": {}, + "MA-IFR": {}, "MA-INE": {}, "MA-JDI": {}, "MA-JRA": {}, "MA-KEN": {}, + "MA-KES": {}, "MA-KHE": {}, "MA-KHN": {}, "MA-KHO": {}, "MA-LAA": {}, + "MA-LAR": {}, "MA-MED": {}, "MA-MEK": {}, "MA-MMD": {}, "MA-MMN": {}, + "MA-MOH": {}, "MA-MOU": {}, "MA-NAD": {}, "MA-NOU": {}, "MA-OUA": {}, + "MA-OUD": {}, "MA-OUJ": {}, "MA-RAB": {}, "MA-SAF": {}, "MA-SAL": {}, + "MA-SEF": {}, "MA-SET": {}, "MA-SIK": {}, "MA-SKH": {}, "MA-SYB": {}, + "MA-TAI": {}, "MA-TAO": {}, "MA-TAR": {}, "MA-TAT": {}, "MA-TAZ": {}, + "MA-TET": {}, "MA-TIZ": {}, "MA-TNG": {}, "MA-TNT": {}, "MA-ZAG": {}, + "MC-CL": {}, "MC-CO": {}, "MC-FO": {}, "MC-GA": {}, "MC-JE": {}, + "MC-LA": {}, "MC-MA": {}, "MC-MC": {}, "MC-MG": {}, "MC-MO": {}, + "MC-MU": {}, "MC-PH": {}, "MC-SD": {}, "MC-SO": {}, "MC-SP": {}, + "MC-SR": {}, "MC-VR": {}, "MD-AN": {}, "MD-BA": {}, "MD-BD": {}, + "MD-BR": {}, "MD-BS": {}, "MD-CA": {}, "MD-CL": {}, "MD-CM": {}, + "MD-CR": {}, "MD-CS": {}, "MD-CT": {}, "MD-CU": {}, "MD-DO": {}, + "MD-DR": {}, "MD-DU": {}, "MD-ED": {}, "MD-FA": {}, "MD-FL": {}, + "MD-GA": {}, "MD-GL": {}, "MD-HI": {}, "MD-IA": {}, "MD-LE": {}, + "MD-NI": {}, "MD-OC": {}, "MD-OR": {}, "MD-RE": {}, "MD-RI": {}, + "MD-SD": {}, "MD-SI": {}, "MD-SN": {}, "MD-SO": {}, "MD-ST": {}, + "MD-SV": {}, "MD-TA": {}, "MD-TE": {}, "MD-UN": {}, "ME-01": {}, + "ME-02": {}, "ME-03": {}, "ME-04": {}, "ME-05": {}, "ME-06": {}, + "ME-07": {}, "ME-08": {}, "ME-09": {}, "ME-10": {}, "ME-11": {}, + "ME-12": {}, "ME-13": {}, "ME-14": {}, "ME-15": {}, "ME-16": {}, + "ME-17": {}, "ME-18": {}, "ME-19": {}, "ME-20": {}, "ME-21": {}, "ME-24": {}, + "MG-A": {}, "MG-D": {}, "MG-F": {}, "MG-M": {}, "MG-T": {}, + "MG-U": {}, "MH-ALK": {}, "MH-ALL": {}, "MH-ARN": {}, "MH-AUR": {}, + "MH-EBO": {}, "MH-ENI": {}, "MH-JAB": {}, "MH-JAL": {}, "MH-KIL": {}, + "MH-KWA": {}, "MH-L": {}, "MH-LAE": {}, "MH-LIB": {}, "MH-LIK": {}, + "MH-MAJ": {}, "MH-MAL": {}, "MH-MEJ": {}, "MH-MIL": {}, "MH-NMK": {}, + "MH-NMU": {}, "MH-RON": {}, "MH-T": {}, "MH-UJA": {}, "MH-UTI": {}, + "MH-WTJ": {}, "MH-WTN": {}, "MK-101": {}, "MK-102": {}, "MK-103": {}, + "MK-104": {}, "MK-105": {}, + "MK-106": {}, "MK-107": {}, "MK-108": {}, "MK-109": {}, "MK-201": {}, + "MK-202": {}, "MK-205": {}, "MK-206": {}, "MK-207": {}, "MK-208": {}, + "MK-209": {}, "MK-210": {}, "MK-211": {}, "MK-301": {}, "MK-303": {}, + "MK-307": {}, "MK-308": {}, "MK-310": {}, "MK-311": {}, "MK-312": {}, + "MK-401": {}, "MK-402": {}, "MK-403": {}, "MK-404": {}, "MK-405": {}, + "MK-406": {}, "MK-408": {}, "MK-409": {}, "MK-410": {}, "MK-501": {}, + "MK-502": {}, "MK-503": {}, "MK-505": {}, "MK-506": {}, "MK-507": {}, + "MK-508": {}, "MK-509": {}, "MK-601": {}, "MK-602": {}, "MK-604": {}, + "MK-605": {}, "MK-606": {}, "MK-607": {}, "MK-608": {}, "MK-609": {}, + "MK-701": {}, "MK-702": {}, "MK-703": {}, "MK-704": {}, "MK-705": {}, + "MK-803": {}, "MK-804": {}, "MK-806": {}, "MK-807": {}, "MK-809": {}, + "MK-810": {}, "MK-811": {}, "MK-812": {}, "MK-813": {}, "MK-814": {}, + "MK-816": {}, "ML-1": {}, "ML-2": {}, "ML-3": {}, "ML-4": {}, + "ML-5": {}, "ML-6": {}, "ML-7": {}, "ML-8": {}, "ML-BKO": {}, + "MM-01": {}, "MM-02": {}, "MM-03": {}, "MM-04": {}, "MM-05": {}, + "MM-06": {}, "MM-07": {}, "MM-11": {}, "MM-12": {}, "MM-13": {}, + "MM-14": {}, "MM-15": {}, "MM-16": {}, "MM-17": {}, "MM-18": {}, "MN-035": {}, + "MN-037": {}, "MN-039": {}, "MN-041": {}, "MN-043": {}, "MN-046": {}, + "MN-047": {}, "MN-049": {}, "MN-051": {}, "MN-053": {}, "MN-055": {}, + "MN-057": {}, "MN-059": {}, "MN-061": {}, "MN-063": {}, "MN-064": {}, + "MN-065": {}, "MN-067": {}, "MN-069": {}, "MN-071": {}, "MN-073": {}, + "MN-1": {}, "MR-01": {}, "MR-02": {}, "MR-03": {}, "MR-04": {}, + "MR-05": {}, "MR-06": {}, "MR-07": {}, "MR-08": {}, "MR-09": {}, + "MR-10": {}, "MR-11": {}, "MR-12": {}, "MR-13": {}, "MR-NKC": {}, "MT-01": {}, + "MT-02": {}, "MT-03": {}, "MT-04": {}, "MT-05": {}, "MT-06": {}, + "MT-07": {}, "MT-08": {}, "MT-09": {}, "MT-10": {}, "MT-11": {}, + "MT-12": {}, "MT-13": {}, "MT-14": {}, "MT-15": {}, "MT-16": {}, + "MT-17": {}, "MT-18": {}, "MT-19": {}, "MT-20": {}, "MT-21": {}, + "MT-22": {}, "MT-23": {}, "MT-24": {}, "MT-25": {}, "MT-26": {}, + "MT-27": {}, "MT-28": {}, "MT-29": {}, "MT-30": {}, "MT-31": {}, + "MT-32": {}, "MT-33": {}, "MT-34": {}, "MT-35": {}, "MT-36": {}, + "MT-37": {}, "MT-38": {}, "MT-39": {}, "MT-40": {}, "MT-41": {}, + "MT-42": {}, "MT-43": {}, "MT-44": {}, "MT-45": {}, "MT-46": {}, + "MT-47": {}, "MT-48": {}, "MT-49": {}, "MT-50": {}, "MT-51": {}, + "MT-52": {}, "MT-53": {}, "MT-54": {}, "MT-55": {}, "MT-56": {}, + "MT-57": {}, "MT-58": {}, "MT-59": {}, "MT-60": {}, "MT-61": {}, + "MT-62": {}, "MT-63": {}, "MT-64": {}, "MT-65": {}, "MT-66": {}, + "MT-67": {}, "MT-68": {}, "MU-AG": {}, "MU-BL": {}, "MU-BR": {}, + "MU-CC": {}, "MU-CU": {}, "MU-FL": {}, "MU-GP": {}, "MU-MO": {}, + "MU-PA": {}, "MU-PL": {}, "MU-PU": {}, "MU-PW": {}, "MU-QB": {}, + "MU-RO": {}, "MU-RP": {}, "MU-RR": {}, "MU-SA": {}, "MU-VP": {}, "MV-00": {}, + "MV-01": {}, "MV-02": {}, "MV-03": {}, "MV-04": {}, "MV-05": {}, + "MV-07": {}, "MV-08": {}, "MV-12": {}, "MV-13": {}, "MV-14": {}, + "MV-17": {}, "MV-20": {}, "MV-23": {}, "MV-24": {}, "MV-25": {}, + "MV-26": {}, "MV-27": {}, "MV-28": {}, "MV-29": {}, "MV-CE": {}, + "MV-MLE": {}, "MV-NC": {}, "MV-NO": {}, "MV-SC": {}, "MV-SU": {}, + "MV-UN": {}, "MV-US": {}, "MW-BA": {}, "MW-BL": {}, "MW-C": {}, + "MW-CK": {}, "MW-CR": {}, "MW-CT": {}, "MW-DE": {}, "MW-DO": {}, + "MW-KR": {}, "MW-KS": {}, "MW-LI": {}, "MW-LK": {}, "MW-MC": {}, + "MW-MG": {}, "MW-MH": {}, "MW-MU": {}, "MW-MW": {}, "MW-MZ": {}, + "MW-N": {}, "MW-NB": {}, "MW-NE": {}, "MW-NI": {}, "MW-NK": {}, + "MW-NS": {}, "MW-NU": {}, "MW-PH": {}, "MW-RU": {}, "MW-S": {}, + "MW-SA": {}, "MW-TH": {}, "MW-ZO": {}, "MX-AGU": {}, "MX-BCN": {}, + "MX-BCS": {}, "MX-CAM": {}, "MX-CHH": {}, "MX-CHP": {}, "MX-COA": {}, + "MX-COL": {}, "MX-CMX": {}, "MX-DIF": {}, "MX-DUR": {}, "MX-GRO": {}, "MX-GUA": {}, + "MX-HID": {}, "MX-JAL": {}, "MX-MEX": {}, "MX-MIC": {}, "MX-MOR": {}, + "MX-NAY": {}, "MX-NLE": {}, "MX-OAX": {}, "MX-PUE": {}, "MX-QUE": {}, + "MX-ROO": {}, "MX-SIN": {}, "MX-SLP": {}, "MX-SON": {}, "MX-TAB": {}, + "MX-TAM": {}, "MX-TLA": {}, "MX-VER": {}, "MX-YUC": {}, "MX-ZAC": {}, + "MY-01": {}, "MY-02": {}, "MY-03": {}, "MY-04": {}, "MY-05": {}, + "MY-06": {}, "MY-07": {}, "MY-08": {}, "MY-09": {}, "MY-10": {}, + "MY-11": {}, "MY-12": {}, "MY-13": {}, "MY-14": {}, "MY-15": {}, + "MY-16": {}, "MZ-A": {}, "MZ-B": {}, "MZ-G": {}, "MZ-I": {}, + "MZ-L": {}, "MZ-MPM": {}, "MZ-N": {}, "MZ-P": {}, "MZ-Q": {}, + "MZ-S": {}, "MZ-T": {}, "NA-CA": {}, "NA-ER": {}, "NA-HA": {}, + "NA-KA": {}, "NA-KE": {}, "NA-KH": {}, "NA-KU": {}, "NA-KW": {}, "NA-OD": {}, "NA-OH": {}, + "NA-OK": {}, "NA-ON": {}, "NA-OS": {}, "NA-OT": {}, "NA-OW": {}, + "NE-1": {}, "NE-2": {}, "NE-3": {}, "NE-4": {}, "NE-5": {}, + "NE-6": {}, "NE-7": {}, "NE-8": {}, "NG-AB": {}, "NG-AD": {}, + "NG-AK": {}, "NG-AN": {}, "NG-BA": {}, "NG-BE": {}, "NG-BO": {}, + "NG-BY": {}, "NG-CR": {}, "NG-DE": {}, "NG-EB": {}, "NG-ED": {}, + "NG-EK": {}, "NG-EN": {}, "NG-FC": {}, "NG-GO": {}, "NG-IM": {}, + "NG-JI": {}, "NG-KD": {}, "NG-KE": {}, "NG-KN": {}, "NG-KO": {}, + "NG-KT": {}, "NG-KW": {}, "NG-LA": {}, "NG-NA": {}, "NG-NI": {}, + "NG-OG": {}, "NG-ON": {}, "NG-OS": {}, "NG-OY": {}, "NG-PL": {}, + "NG-RI": {}, "NG-SO": {}, "NG-TA": {}, "NG-YO": {}, "NG-ZA": {}, + "NI-AN": {}, "NI-AS": {}, "NI-BO": {}, "NI-CA": {}, "NI-CI": {}, + "NI-CO": {}, "NI-ES": {}, "NI-GR": {}, "NI-JI": {}, "NI-LE": {}, + "NI-MD": {}, "NI-MN": {}, "NI-MS": {}, "NI-MT": {}, "NI-NS": {}, + "NI-RI": {}, "NI-SJ": {}, "NL-AW": {}, "NL-BQ1": {}, "NL-BQ2": {}, + "NL-BQ3": {}, "NL-CW": {}, "NL-DR": {}, "NL-FL": {}, "NL-FR": {}, + "NL-GE": {}, "NL-GR": {}, "NL-LI": {}, "NL-NB": {}, "NL-NH": {}, + "NL-OV": {}, "NL-SX": {}, "NL-UT": {}, "NL-ZE": {}, "NL-ZH": {}, + "NO-03": {}, "NO-11": {}, "NO-15": {}, "NO-16": {}, "NO-17": {}, + "NO-18": {}, "NO-21": {}, "NO-30": {}, "NO-34": {}, "NO-38": {}, + "NO-42": {}, "NO-46": {}, "NO-50": {}, "NO-54": {}, + "NO-22": {}, "NP-1": {}, "NP-2": {}, "NP-3": {}, "NP-4": {}, + "NP-5": {}, "NP-BA": {}, "NP-BH": {}, "NP-DH": {}, "NP-GA": {}, + "NP-JA": {}, "NP-KA": {}, "NP-KO": {}, "NP-LU": {}, "NP-MA": {}, + "NP-ME": {}, "NP-NA": {}, "NP-RA": {}, "NP-SA": {}, "NP-SE": {}, + "NR-01": {}, "NR-02": {}, "NR-03": {}, "NR-04": {}, "NR-05": {}, + "NR-06": {}, "NR-07": {}, "NR-08": {}, "NR-09": {}, "NR-10": {}, + "NR-11": {}, "NR-12": {}, "NR-13": {}, "NR-14": {}, "NZ-AUK": {}, + "NZ-BOP": {}, "NZ-CAN": {}, "NZ-CIT": {}, "NZ-GIS": {}, "NZ-HKB": {}, + "NZ-MBH": {}, "NZ-MWT": {}, "NZ-N": {}, "NZ-NSN": {}, "NZ-NTL": {}, + "NZ-OTA": {}, "NZ-S": {}, "NZ-STL": {}, "NZ-TAS": {}, "NZ-TKI": {}, + "NZ-WGN": {}, "NZ-WKO": {}, "NZ-WTC": {}, "OM-BA": {}, "OM-BS": {}, "OM-BU": {}, "OM-BJ": {}, + "OM-DA": {}, "OM-MA": {}, "OM-MU": {}, "OM-SH": {}, "OM-SJ": {}, "OM-SS": {}, "OM-WU": {}, + "OM-ZA": {}, "OM-ZU": {}, "PA-1": {}, "PA-2": {}, "PA-3": {}, + "PA-4": {}, "PA-5": {}, "PA-6": {}, "PA-7": {}, "PA-8": {}, + "PA-9": {}, "PA-EM": {}, "PA-KY": {}, "PA-NB": {}, "PE-AMA": {}, + "PE-ANC": {}, "PE-APU": {}, "PE-ARE": {}, "PE-AYA": {}, "PE-CAJ": {}, + "PE-CAL": {}, "PE-CUS": {}, "PE-HUC": {}, "PE-HUV": {}, "PE-ICA": {}, + "PE-JUN": {}, "PE-LAL": {}, "PE-LAM": {}, "PE-LIM": {}, "PE-LMA": {}, + "PE-LOR": {}, "PE-MDD": {}, "PE-MOQ": {}, "PE-PAS": {}, "PE-PIU": {}, + "PE-PUN": {}, "PE-SAM": {}, "PE-TAC": {}, "PE-TUM": {}, "PE-UCA": {}, + "PG-CPK": {}, "PG-CPM": {}, "PG-EBR": {}, "PG-EHG": {}, "PG-EPW": {}, + "PG-ESW": {}, "PG-GPK": {}, "PG-MBA": {}, "PG-MPL": {}, "PG-MPM": {}, + "PG-MRL": {}, "PG-NCD": {}, "PG-NIK": {}, "PG-NPP": {}, "PG-NSB": {}, + "PG-SAN": {}, "PG-SHM": {}, "PG-WBK": {}, "PG-WHM": {}, "PG-WPD": {}, + "PH-00": {}, "PH-01": {}, "PH-02": {}, "PH-03": {}, "PH-05": {}, + "PH-06": {}, "PH-07": {}, "PH-08": {}, "PH-09": {}, "PH-10": {}, + "PH-11": {}, "PH-12": {}, "PH-13": {}, "PH-14": {}, "PH-15": {}, + "PH-40": {}, "PH-41": {}, "PH-ABR": {}, "PH-AGN": {}, "PH-AGS": {}, + "PH-AKL": {}, "PH-ALB": {}, "PH-ANT": {}, "PH-APA": {}, "PH-AUR": {}, + "PH-BAN": {}, "PH-BAS": {}, "PH-BEN": {}, "PH-BIL": {}, "PH-BOH": {}, + "PH-BTG": {}, "PH-BTN": {}, "PH-BUK": {}, "PH-BUL": {}, "PH-CAG": {}, + "PH-CAM": {}, "PH-CAN": {}, "PH-CAP": {}, "PH-CAS": {}, "PH-CAT": {}, + "PH-CAV": {}, "PH-CEB": {}, "PH-COM": {}, "PH-DAO": {}, "PH-DAS": {}, + "PH-DAV": {}, "PH-DIN": {}, "PH-EAS": {}, "PH-GUI": {}, "PH-IFU": {}, + "PH-ILI": {}, "PH-ILN": {}, "PH-ILS": {}, "PH-ISA": {}, "PH-KAL": {}, + "PH-LAG": {}, "PH-LAN": {}, "PH-LAS": {}, "PH-LEY": {}, "PH-LUN": {}, + "PH-MAD": {}, "PH-MAG": {}, "PH-MAS": {}, "PH-MDC": {}, "PH-MDR": {}, + "PH-MOU": {}, "PH-MSC": {}, "PH-MSR": {}, "PH-NCO": {}, "PH-NEC": {}, + "PH-NER": {}, "PH-NSA": {}, "PH-NUE": {}, "PH-NUV": {}, "PH-PAM": {}, + "PH-PAN": {}, "PH-PLW": {}, "PH-QUE": {}, "PH-QUI": {}, "PH-RIZ": {}, + "PH-ROM": {}, "PH-SAR": {}, "PH-SCO": {}, "PH-SIG": {}, "PH-SLE": {}, + "PH-SLU": {}, "PH-SOR": {}, "PH-SUK": {}, "PH-SUN": {}, "PH-SUR": {}, + "PH-TAR": {}, "PH-TAW": {}, "PH-WSA": {}, "PH-ZAN": {}, "PH-ZAS": {}, + "PH-ZMB": {}, "PH-ZSI": {}, "PK-BA": {}, "PK-GB": {}, "PK-IS": {}, + "PK-JK": {}, "PK-KP": {}, "PK-PB": {}, "PK-SD": {}, "PK-TA": {}, + "PL-02": {}, "PL-04": {}, "PL-06": {}, "PL-08": {}, "PL-10": {}, + "PL-12": {}, "PL-14": {}, "PL-16": {}, "PL-18": {}, "PL-20": {}, + "PL-22": {}, "PL-24": {}, "PL-26": {}, "PL-28": {}, "PL-30": {}, "PL-32": {}, + "PS-BTH": {}, "PS-DEB": {}, "PS-GZA": {}, "PS-HBN": {}, + "PS-JEM": {}, "PS-JEN": {}, "PS-JRH": {}, "PS-KYS": {}, "PS-NBS": {}, + "PS-NGZ": {}, "PS-QQA": {}, "PS-RBH": {}, "PS-RFH": {}, "PS-SLT": {}, + "PS-TBS": {}, "PS-TKM": {}, "PT-01": {}, "PT-02": {}, "PT-03": {}, + "PT-04": {}, "PT-05": {}, "PT-06": {}, "PT-07": {}, "PT-08": {}, + "PT-09": {}, "PT-10": {}, "PT-11": {}, "PT-12": {}, "PT-13": {}, + "PT-14": {}, "PT-15": {}, "PT-16": {}, "PT-17": {}, "PT-18": {}, + "PT-20": {}, "PT-30": {}, "PW-002": {}, "PW-004": {}, "PW-010": {}, + "PW-050": {}, "PW-100": {}, "PW-150": {}, "PW-212": {}, "PW-214": {}, + "PW-218": {}, "PW-222": {}, "PW-224": {}, "PW-226": {}, "PW-227": {}, + "PW-228": {}, "PW-350": {}, "PW-370": {}, "PY-1": {}, "PY-10": {}, + "PY-11": {}, "PY-12": {}, "PY-13": {}, "PY-14": {}, "PY-15": {}, + "PY-16": {}, "PY-19": {}, "PY-2": {}, "PY-3": {}, "PY-4": {}, + "PY-5": {}, "PY-6": {}, "PY-7": {}, "PY-8": {}, "PY-9": {}, + "PY-ASU": {}, "QA-DA": {}, "QA-KH": {}, "QA-MS": {}, "QA-RA": {}, + "QA-US": {}, "QA-WA": {}, "QA-ZA": {}, "RO-AB": {}, "RO-AG": {}, + "RO-AR": {}, "RO-B": {}, "RO-BC": {}, "RO-BH": {}, "RO-BN": {}, + "RO-BR": {}, "RO-BT": {}, "RO-BV": {}, "RO-BZ": {}, "RO-CJ": {}, + "RO-CL": {}, "RO-CS": {}, "RO-CT": {}, "RO-CV": {}, "RO-DB": {}, + "RO-DJ": {}, "RO-GJ": {}, "RO-GL": {}, "RO-GR": {}, "RO-HD": {}, + "RO-HR": {}, "RO-IF": {}, "RO-IL": {}, "RO-IS": {}, "RO-MH": {}, + "RO-MM": {}, "RO-MS": {}, "RO-NT": {}, "RO-OT": {}, "RO-PH": {}, + "RO-SB": {}, "RO-SJ": {}, "RO-SM": {}, "RO-SV": {}, "RO-TL": {}, + "RO-TM": {}, "RO-TR": {}, "RO-VL": {}, "RO-VN": {}, "RO-VS": {}, + "RS-00": {}, "RS-01": {}, "RS-02": {}, "RS-03": {}, "RS-04": {}, + "RS-05": {}, "RS-06": {}, "RS-07": {}, "RS-08": {}, "RS-09": {}, + "RS-10": {}, "RS-11": {}, "RS-12": {}, "RS-13": {}, "RS-14": {}, + "RS-15": {}, "RS-16": {}, "RS-17": {}, "RS-18": {}, "RS-19": {}, + "RS-20": {}, "RS-21": {}, "RS-22": {}, "RS-23": {}, "RS-24": {}, + "RS-25": {}, "RS-26": {}, "RS-27": {}, "RS-28": {}, "RS-29": {}, + "RS-KM": {}, "RS-VO": {}, "RU-AD": {}, "RU-AL": {}, "RU-ALT": {}, + "RU-AMU": {}, "RU-ARK": {}, "RU-AST": {}, "RU-BA": {}, "RU-BEL": {}, + "RU-BRY": {}, "RU-BU": {}, "RU-CE": {}, "RU-CHE": {}, "RU-CHU": {}, + "RU-CU": {}, "RU-DA": {}, "RU-IN": {}, "RU-IRK": {}, "RU-IVA": {}, + "RU-KAM": {}, "RU-KB": {}, "RU-KC": {}, "RU-KDA": {}, "RU-KEM": {}, + "RU-KGD": {}, "RU-KGN": {}, "RU-KHA": {}, "RU-KHM": {}, "RU-KIR": {}, + "RU-KK": {}, "RU-KL": {}, "RU-KLU": {}, "RU-KO": {}, "RU-KOS": {}, + "RU-KR": {}, "RU-KRS": {}, "RU-KYA": {}, "RU-LEN": {}, "RU-LIP": {}, + "RU-MAG": {}, "RU-ME": {}, "RU-MO": {}, "RU-MOS": {}, "RU-MOW": {}, + "RU-MUR": {}, "RU-NEN": {}, "RU-NGR": {}, "RU-NIZ": {}, "RU-NVS": {}, + "RU-OMS": {}, "RU-ORE": {}, "RU-ORL": {}, "RU-PER": {}, "RU-PNZ": {}, + "RU-PRI": {}, "RU-PSK": {}, "RU-ROS": {}, "RU-RYA": {}, "RU-SA": {}, + "RU-SAK": {}, "RU-SAM": {}, "RU-SAR": {}, "RU-SE": {}, "RU-SMO": {}, + "RU-SPE": {}, "RU-STA": {}, "RU-SVE": {}, "RU-TA": {}, "RU-TAM": {}, + "RU-TOM": {}, "RU-TUL": {}, "RU-TVE": {}, "RU-TY": {}, "RU-TYU": {}, + "RU-UD": {}, "RU-ULY": {}, "RU-VGG": {}, "RU-VLA": {}, "RU-VLG": {}, + "RU-VOR": {}, "RU-YAN": {}, "RU-YAR": {}, "RU-YEV": {}, "RU-ZAB": {}, + "RW-01": {}, "RW-02": {}, "RW-03": {}, "RW-04": {}, "RW-05": {}, + "SA-01": {}, "SA-02": {}, "SA-03": {}, "SA-04": {}, "SA-05": {}, + "SA-06": {}, "SA-07": {}, "SA-08": {}, "SA-09": {}, "SA-10": {}, + "SA-11": {}, "SA-12": {}, "SA-14": {}, "SB-CE": {}, "SB-CH": {}, + "SB-CT": {}, "SB-GU": {}, "SB-IS": {}, "SB-MK": {}, "SB-ML": {}, + "SB-RB": {}, "SB-TE": {}, "SB-WE": {}, "SC-01": {}, "SC-02": {}, + "SC-03": {}, "SC-04": {}, "SC-05": {}, "SC-06": {}, "SC-07": {}, + "SC-08": {}, "SC-09": {}, "SC-10": {}, "SC-11": {}, "SC-12": {}, + "SC-13": {}, "SC-14": {}, "SC-15": {}, "SC-16": {}, "SC-17": {}, + "SC-18": {}, "SC-19": {}, "SC-20": {}, "SC-21": {}, "SC-22": {}, + "SC-23": {}, "SC-24": {}, "SC-25": {}, "SD-DC": {}, "SD-DE": {}, + "SD-DN": {}, "SD-DS": {}, "SD-DW": {}, "SD-GD": {}, "SD-GK": {}, "SD-GZ": {}, + "SD-KA": {}, "SD-KH": {}, "SD-KN": {}, "SD-KS": {}, "SD-NB": {}, + "SD-NO": {}, "SD-NR": {}, "SD-NW": {}, "SD-RS": {}, "SD-SI": {}, + "SE-AB": {}, "SE-AC": {}, "SE-BD": {}, "SE-C": {}, "SE-D": {}, + "SE-E": {}, "SE-F": {}, "SE-G": {}, "SE-H": {}, "SE-I": {}, + "SE-K": {}, "SE-M": {}, "SE-N": {}, "SE-O": {}, "SE-S": {}, + "SE-T": {}, "SE-U": {}, "SE-W": {}, "SE-X": {}, "SE-Y": {}, + "SE-Z": {}, "SG-01": {}, "SG-02": {}, "SG-03": {}, "SG-04": {}, + "SG-05": {}, "SH-AC": {}, "SH-HL": {}, "SH-TA": {}, "SI-001": {}, + "SI-002": {}, "SI-003": {}, "SI-004": {}, "SI-005": {}, "SI-006": {}, + "SI-007": {}, "SI-008": {}, "SI-009": {}, "SI-010": {}, "SI-011": {}, + "SI-012": {}, "SI-013": {}, "SI-014": {}, "SI-015": {}, "SI-016": {}, + "SI-017": {}, "SI-018": {}, "SI-019": {}, "SI-020": {}, "SI-021": {}, + "SI-022": {}, "SI-023": {}, "SI-024": {}, "SI-025": {}, "SI-026": {}, + "SI-027": {}, "SI-028": {}, "SI-029": {}, "SI-030": {}, "SI-031": {}, + "SI-032": {}, "SI-033": {}, "SI-034": {}, "SI-035": {}, "SI-036": {}, + "SI-037": {}, "SI-038": {}, "SI-039": {}, "SI-040": {}, "SI-041": {}, + "SI-042": {}, "SI-043": {}, "SI-044": {}, "SI-045": {}, "SI-046": {}, + "SI-047": {}, "SI-048": {}, "SI-049": {}, "SI-050": {}, "SI-051": {}, + "SI-052": {}, "SI-053": {}, "SI-054": {}, "SI-055": {}, "SI-056": {}, + "SI-057": {}, "SI-058": {}, "SI-059": {}, "SI-060": {}, "SI-061": {}, + "SI-062": {}, "SI-063": {}, "SI-064": {}, "SI-065": {}, "SI-066": {}, + "SI-067": {}, "SI-068": {}, "SI-069": {}, "SI-070": {}, "SI-071": {}, + "SI-072": {}, "SI-073": {}, "SI-074": {}, "SI-075": {}, "SI-076": {}, + "SI-077": {}, "SI-078": {}, "SI-079": {}, "SI-080": {}, "SI-081": {}, + "SI-082": {}, "SI-083": {}, "SI-084": {}, "SI-085": {}, "SI-086": {}, + "SI-087": {}, "SI-088": {}, "SI-089": {}, "SI-090": {}, "SI-091": {}, + "SI-092": {}, "SI-093": {}, "SI-094": {}, "SI-095": {}, "SI-096": {}, + "SI-097": {}, "SI-098": {}, "SI-099": {}, "SI-100": {}, "SI-101": {}, + "SI-102": {}, "SI-103": {}, "SI-104": {}, "SI-105": {}, "SI-106": {}, + "SI-107": {}, "SI-108": {}, "SI-109": {}, "SI-110": {}, "SI-111": {}, + "SI-112": {}, "SI-113": {}, "SI-114": {}, "SI-115": {}, "SI-116": {}, + "SI-117": {}, "SI-118": {}, "SI-119": {}, "SI-120": {}, "SI-121": {}, + "SI-122": {}, "SI-123": {}, "SI-124": {}, "SI-125": {}, "SI-126": {}, + "SI-127": {}, "SI-128": {}, "SI-129": {}, "SI-130": {}, "SI-131": {}, + "SI-132": {}, "SI-133": {}, "SI-134": {}, "SI-135": {}, "SI-136": {}, + "SI-137": {}, "SI-138": {}, "SI-139": {}, "SI-140": {}, "SI-141": {}, + "SI-142": {}, "SI-143": {}, "SI-144": {}, "SI-146": {}, "SI-147": {}, + "SI-148": {}, "SI-149": {}, "SI-150": {}, "SI-151": {}, "SI-152": {}, + "SI-153": {}, "SI-154": {}, "SI-155": {}, "SI-156": {}, "SI-157": {}, + "SI-158": {}, "SI-159": {}, "SI-160": {}, "SI-161": {}, "SI-162": {}, + "SI-163": {}, "SI-164": {}, "SI-165": {}, "SI-166": {}, "SI-167": {}, + "SI-168": {}, "SI-169": {}, "SI-170": {}, "SI-171": {}, "SI-172": {}, + "SI-173": {}, "SI-174": {}, "SI-175": {}, "SI-176": {}, "SI-177": {}, + "SI-178": {}, "SI-179": {}, "SI-180": {}, "SI-181": {}, "SI-182": {}, + "SI-183": {}, "SI-184": {}, "SI-185": {}, "SI-186": {}, "SI-187": {}, + "SI-188": {}, "SI-189": {}, "SI-190": {}, "SI-191": {}, "SI-192": {}, + "SI-193": {}, "SI-194": {}, "SI-195": {}, "SI-196": {}, "SI-197": {}, + "SI-198": {}, "SI-199": {}, "SI-200": {}, "SI-201": {}, "SI-202": {}, + "SI-203": {}, "SI-204": {}, "SI-205": {}, "SI-206": {}, "SI-207": {}, + "SI-208": {}, "SI-209": {}, "SI-210": {}, "SI-211": {}, "SI-212": {}, "SI-213": {}, "SK-BC": {}, + "SK-BL": {}, "SK-KI": {}, "SK-NI": {}, "SK-PV": {}, "SK-TA": {}, + "SK-TC": {}, "SK-ZI": {}, "SL-E": {}, "SL-N": {}, "SL-S": {}, + "SL-W": {}, "SM-01": {}, "SM-02": {}, "SM-03": {}, "SM-04": {}, + "SM-05": {}, "SM-06": {}, "SM-07": {}, "SM-08": {}, "SM-09": {}, + "SN-DB": {}, "SN-DK": {}, "SN-FK": {}, "SN-KA": {}, "SN-KD": {}, + "SN-KE": {}, "SN-KL": {}, "SN-LG": {}, "SN-MT": {}, "SN-SE": {}, + "SN-SL": {}, "SN-TC": {}, "SN-TH": {}, "SN-ZG": {}, "SO-AW": {}, + "SO-BK": {}, "SO-BN": {}, "SO-BR": {}, "SO-BY": {}, "SO-GA": {}, + "SO-GE": {}, "SO-HI": {}, "SO-JD": {}, "SO-JH": {}, "SO-MU": {}, + "SO-NU": {}, "SO-SA": {}, "SO-SD": {}, "SO-SH": {}, "SO-SO": {}, + "SO-TO": {}, "SO-WO": {}, "SR-BR": {}, "SR-CM": {}, "SR-CR": {}, + "SR-MA": {}, "SR-NI": {}, "SR-PM": {}, "SR-PR": {}, "SR-SA": {}, + "SR-SI": {}, "SR-WA": {}, "SS-BN": {}, "SS-BW": {}, "SS-EC": {}, + "SS-EE8": {}, "SS-EE": {}, "SS-EW": {}, "SS-JG": {}, "SS-LK": {}, "SS-NU": {}, + "SS-UY": {}, "SS-WR": {}, "ST-01": {}, "ST-P": {}, "ST-S": {}, "SV-AH": {}, + "SV-CA": {}, "SV-CH": {}, "SV-CU": {}, "SV-LI": {}, "SV-MO": {}, + "SV-PA": {}, "SV-SA": {}, "SV-SM": {}, "SV-SO": {}, "SV-SS": {}, + "SV-SV": {}, "SV-UN": {}, "SV-US": {}, "SY-DI": {}, "SY-DR": {}, + "SY-DY": {}, "SY-HA": {}, "SY-HI": {}, "SY-HL": {}, "SY-HM": {}, + "SY-ID": {}, "SY-LA": {}, "SY-QU": {}, "SY-RA": {}, "SY-RD": {}, + "SY-SU": {}, "SY-TA": {}, "SZ-HH": {}, "SZ-LU": {}, "SZ-MA": {}, + "SZ-SH": {}, "TD-BA": {}, "TD-BG": {}, "TD-BO": {}, "TD-CB": {}, + "TD-EN": {}, "TD-GR": {}, "TD-HL": {}, "TD-KA": {}, "TD-LC": {}, + "TD-LO": {}, "TD-LR": {}, "TD-MA": {}, "TD-MC": {}, "TD-ME": {}, + "TD-MO": {}, "TD-ND": {}, "TD-OD": {}, "TD-SA": {}, "TD-SI": {}, + "TD-TA": {}, "TD-TI": {}, "TD-WF": {}, "TG-C": {}, "TG-K": {}, + "TG-M": {}, "TG-P": {}, "TG-S": {}, "TH-10": {}, "TH-11": {}, + "TH-12": {}, "TH-13": {}, "TH-14": {}, "TH-15": {}, "TH-16": {}, + "TH-17": {}, "TH-18": {}, "TH-19": {}, "TH-20": {}, "TH-21": {}, + "TH-22": {}, "TH-23": {}, "TH-24": {}, "TH-25": {}, "TH-26": {}, + "TH-27": {}, "TH-30": {}, "TH-31": {}, "TH-32": {}, "TH-33": {}, + "TH-34": {}, "TH-35": {}, "TH-36": {}, "TH-37": {}, "TH-38": {}, "TH-39": {}, + "TH-40": {}, "TH-41": {}, "TH-42": {}, "TH-43": {}, "TH-44": {}, + "TH-45": {}, "TH-46": {}, "TH-47": {}, "TH-48": {}, "TH-49": {}, + "TH-50": {}, "TH-51": {}, "TH-52": {}, "TH-53": {}, "TH-54": {}, + "TH-55": {}, "TH-56": {}, "TH-57": {}, "TH-58": {}, "TH-60": {}, + "TH-61": {}, "TH-62": {}, "TH-63": {}, "TH-64": {}, "TH-65": {}, + "TH-66": {}, "TH-67": {}, "TH-70": {}, "TH-71": {}, "TH-72": {}, + "TH-73": {}, "TH-74": {}, "TH-75": {}, "TH-76": {}, "TH-77": {}, + "TH-80": {}, "TH-81": {}, "TH-82": {}, "TH-83": {}, "TH-84": {}, + "TH-85": {}, "TH-86": {}, "TH-90": {}, "TH-91": {}, "TH-92": {}, + "TH-93": {}, "TH-94": {}, "TH-95": {}, "TH-96": {}, "TH-S": {}, + "TJ-GB": {}, "TJ-KT": {}, "TJ-SU": {}, "TJ-DU": {}, "TJ-RA": {}, "TL-AL": {}, "TL-AN": {}, + "TL-BA": {}, "TL-BO": {}, "TL-CO": {}, "TL-DI": {}, "TL-ER": {}, + "TL-LA": {}, "TL-LI": {}, "TL-MF": {}, "TL-MT": {}, "TL-OE": {}, + "TL-VI": {}, "TM-A": {}, "TM-B": {}, "TM-D": {}, "TM-L": {}, + "TM-M": {}, "TM-S": {}, "TN-11": {}, "TN-12": {}, "TN-13": {}, + "TN-14": {}, "TN-21": {}, "TN-22": {}, "TN-23": {}, "TN-31": {}, + "TN-32": {}, "TN-33": {}, "TN-34": {}, "TN-41": {}, "TN-42": {}, + "TN-43": {}, "TN-51": {}, "TN-52": {}, "TN-53": {}, "TN-61": {}, + "TN-71": {}, "TN-72": {}, "TN-73": {}, "TN-81": {}, "TN-82": {}, + "TN-83": {}, "TO-01": {}, "TO-02": {}, "TO-03": {}, "TO-04": {}, + "TO-05": {}, "TR-01": {}, "TR-02": {}, "TR-03": {}, "TR-04": {}, + "TR-05": {}, "TR-06": {}, "TR-07": {}, "TR-08": {}, "TR-09": {}, + "TR-10": {}, "TR-11": {}, "TR-12": {}, "TR-13": {}, "TR-14": {}, + "TR-15": {}, "TR-16": {}, "TR-17": {}, "TR-18": {}, "TR-19": {}, + "TR-20": {}, "TR-21": {}, "TR-22": {}, "TR-23": {}, "TR-24": {}, + "TR-25": {}, "TR-26": {}, "TR-27": {}, "TR-28": {}, "TR-29": {}, + "TR-30": {}, "TR-31": {}, "TR-32": {}, "TR-33": {}, "TR-34": {}, + "TR-35": {}, "TR-36": {}, "TR-37": {}, "TR-38": {}, "TR-39": {}, + "TR-40": {}, "TR-41": {}, "TR-42": {}, "TR-43": {}, "TR-44": {}, + "TR-45": {}, "TR-46": {}, "TR-47": {}, "TR-48": {}, "TR-49": {}, + "TR-50": {}, "TR-51": {}, "TR-52": {}, "TR-53": {}, "TR-54": {}, + "TR-55": {}, "TR-56": {}, "TR-57": {}, "TR-58": {}, "TR-59": {}, + "TR-60": {}, "TR-61": {}, "TR-62": {}, "TR-63": {}, "TR-64": {}, + "TR-65": {}, "TR-66": {}, "TR-67": {}, "TR-68": {}, "TR-69": {}, + "TR-70": {}, "TR-71": {}, "TR-72": {}, "TR-73": {}, "TR-74": {}, + "TR-75": {}, "TR-76": {}, "TR-77": {}, "TR-78": {}, "TR-79": {}, + "TR-80": {}, "TR-81": {}, "TT-ARI": {}, "TT-CHA": {}, "TT-CTT": {}, + "TT-DMN": {}, "TT-ETO": {}, "TT-MRC": {}, "TT-TOB": {}, "TT-PED": {}, "TT-POS": {}, "TT-PRT": {}, + "TT-PTF": {}, "TT-RCM": {}, "TT-SFO": {}, "TT-SGE": {}, "TT-SIP": {}, + "TT-SJL": {}, "TT-TUP": {}, "TT-WTO": {}, "TV-FUN": {}, "TV-NIT": {}, + "TV-NKF": {}, "TV-NKL": {}, "TV-NMA": {}, "TV-NMG": {}, "TV-NUI": {}, + "TV-VAI": {}, "TW-CHA": {}, "TW-CYI": {}, "TW-CYQ": {}, "TW-KIN": {}, "TW-HSQ": {}, + "TW-HSZ": {}, "TW-HUA": {}, "TW-LIE": {}, "TW-ILA": {}, "TW-KEE": {}, "TW-KHH": {}, + "TW-KHQ": {}, "TW-MIA": {}, "TW-NAN": {}, "TW-NWT": {}, "TW-PEN": {}, "TW-PIF": {}, + "TW-TAO": {}, "TW-TNN": {}, "TW-TNQ": {}, "TW-TPE": {}, "TW-TPQ": {}, + "TW-TTT": {}, "TW-TXG": {}, "TW-TXQ": {}, "TW-YUN": {}, "TZ-01": {}, + "TZ-02": {}, "TZ-03": {}, "TZ-04": {}, "TZ-05": {}, "TZ-06": {}, + "TZ-07": {}, "TZ-08": {}, "TZ-09": {}, "TZ-10": {}, "TZ-11": {}, + "TZ-12": {}, "TZ-13": {}, "TZ-14": {}, "TZ-15": {}, "TZ-16": {}, + "TZ-17": {}, "TZ-18": {}, "TZ-19": {}, "TZ-20": {}, "TZ-21": {}, + "TZ-22": {}, "TZ-23": {}, "TZ-24": {}, "TZ-25": {}, "TZ-26": {}, "TZ-27": {}, "TZ-28": {}, "TZ-29": {}, "TZ-30": {}, "TZ-31": {}, + "UA-05": {}, "UA-07": {}, "UA-09": {}, "UA-12": {}, "UA-14": {}, + "UA-18": {}, "UA-21": {}, "UA-23": {}, "UA-26": {}, "UA-30": {}, + "UA-32": {}, "UA-35": {}, "UA-40": {}, "UA-43": {}, "UA-46": {}, + "UA-48": {}, "UA-51": {}, "UA-53": {}, "UA-56": {}, "UA-59": {}, + "UA-61": {}, "UA-63": {}, "UA-65": {}, "UA-68": {}, "UA-71": {}, + "UA-74": {}, "UA-77": {}, "UG-101": {}, "UG-102": {}, "UG-103": {}, + "UG-104": {}, "UG-105": {}, "UG-106": {}, "UG-107": {}, "UG-108": {}, + "UG-109": {}, "UG-110": {}, "UG-111": {}, "UG-112": {}, "UG-113": {}, + "UG-114": {}, "UG-115": {}, "UG-116": {}, "UG-201": {}, "UG-202": {}, + "UG-203": {}, "UG-204": {}, "UG-205": {}, "UG-206": {}, "UG-207": {}, + "UG-208": {}, "UG-209": {}, "UG-210": {}, "UG-211": {}, "UG-212": {}, + "UG-213": {}, "UG-214": {}, "UG-215": {}, "UG-216": {}, "UG-217": {}, + "UG-218": {}, "UG-219": {}, "UG-220": {}, "UG-221": {}, "UG-222": {}, + "UG-223": {}, "UG-224": {}, "UG-301": {}, "UG-302": {}, "UG-303": {}, + "UG-304": {}, "UG-305": {}, "UG-306": {}, "UG-307": {}, "UG-308": {}, + "UG-309": {}, "UG-310": {}, "UG-311": {}, "UG-312": {}, "UG-313": {}, + "UG-314": {}, "UG-315": {}, "UG-316": {}, "UG-317": {}, "UG-318": {}, + "UG-319": {}, "UG-320": {}, "UG-321": {}, "UG-401": {}, "UG-402": {}, + "UG-403": {}, "UG-404": {}, "UG-405": {}, "UG-406": {}, "UG-407": {}, + "UG-408": {}, "UG-409": {}, "UG-410": {}, "UG-411": {}, "UG-412": {}, + "UG-413": {}, "UG-414": {}, "UG-415": {}, "UG-416": {}, "UG-417": {}, + "UG-418": {}, "UG-419": {}, "UG-C": {}, "UG-E": {}, "UG-N": {}, + "UG-W": {}, "UG-322": {}, "UG-323": {}, "UG-420": {}, "UG-117": {}, + "UG-118": {}, "UG-225": {}, "UG-120": {}, "UG-226": {}, + "UG-121": {}, "UG-122": {}, "UG-227": {}, "UG-421": {}, + "UG-325": {}, "UG-228": {}, "UG-123": {}, "UG-422": {}, + "UG-326": {}, "UG-229": {}, "UG-124": {}, "UG-423": {}, + "UG-230": {}, "UG-327": {}, "UG-424": {}, "UG-328": {}, + "UG-425": {}, "UG-426": {}, "UG-330": {}, + "UM-67": {}, "UM-71": {}, "UM-76": {}, "UM-79": {}, + "UM-81": {}, "UM-84": {}, "UM-86": {}, "UM-89": {}, "UM-95": {}, + "US-AK": {}, "US-AL": {}, "US-AR": {}, "US-AS": {}, "US-AZ": {}, + "US-CA": {}, "US-CO": {}, "US-CT": {}, "US-DC": {}, "US-DE": {}, + "US-FL": {}, "US-GA": {}, "US-GU": {}, "US-HI": {}, "US-IA": {}, + "US-ID": {}, "US-IL": {}, "US-IN": {}, "US-KS": {}, "US-KY": {}, + "US-LA": {}, "US-MA": {}, "US-MD": {}, "US-ME": {}, "US-MI": {}, + "US-MN": {}, "US-MO": {}, "US-MP": {}, "US-MS": {}, "US-MT": {}, + "US-NC": {}, "US-ND": {}, "US-NE": {}, "US-NH": {}, "US-NJ": {}, + "US-NM": {}, "US-NV": {}, "US-NY": {}, "US-OH": {}, "US-OK": {}, + "US-OR": {}, "US-PA": {}, "US-PR": {}, "US-RI": {}, "US-SC": {}, + "US-SD": {}, "US-TN": {}, "US-TX": {}, "US-UM": {}, "US-UT": {}, + "US-VA": {}, "US-VI": {}, "US-VT": {}, "US-WA": {}, "US-WI": {}, + "US-WV": {}, "US-WY": {}, "UY-AR": {}, "UY-CA": {}, "UY-CL": {}, + "UY-CO": {}, "UY-DU": {}, "UY-FD": {}, "UY-FS": {}, "UY-LA": {}, + "UY-MA": {}, "UY-MO": {}, "UY-PA": {}, "UY-RN": {}, "UY-RO": {}, + "UY-RV": {}, "UY-SA": {}, "UY-SJ": {}, "UY-SO": {}, "UY-TA": {}, + "UY-TT": {}, "UZ-AN": {}, "UZ-BU": {}, "UZ-FA": {}, "UZ-JI": {}, + "UZ-NG": {}, "UZ-NW": {}, "UZ-QA": {}, "UZ-QR": {}, "UZ-SA": {}, + "UZ-SI": {}, "UZ-SU": {}, "UZ-TK": {}, "UZ-TO": {}, "UZ-XO": {}, + "VC-01": {}, "VC-02": {}, "VC-03": {}, "VC-04": {}, "VC-05": {}, + "VC-06": {}, "VE-A": {}, "VE-B": {}, "VE-C": {}, "VE-D": {}, + "VE-E": {}, "VE-F": {}, "VE-G": {}, "VE-H": {}, "VE-I": {}, + "VE-J": {}, "VE-K": {}, "VE-L": {}, "VE-M": {}, "VE-N": {}, + "VE-O": {}, "VE-P": {}, "VE-R": {}, "VE-S": {}, "VE-T": {}, + "VE-U": {}, "VE-V": {}, "VE-W": {}, "VE-X": {}, "VE-Y": {}, + "VE-Z": {}, "VN-01": {}, "VN-02": {}, "VN-03": {}, "VN-04": {}, + "VN-05": {}, "VN-06": {}, "VN-07": {}, "VN-09": {}, "VN-13": {}, + "VN-14": {}, "VN-15": {}, "VN-18": {}, "VN-20": {}, "VN-21": {}, + "VN-22": {}, "VN-23": {}, "VN-24": {}, "VN-25": {}, "VN-26": {}, + "VN-27": {}, "VN-28": {}, "VN-29": {}, "VN-30": {}, "VN-31": {}, + "VN-32": {}, "VN-33": {}, "VN-34": {}, "VN-35": {}, "VN-36": {}, + "VN-37": {}, "VN-39": {}, "VN-40": {}, "VN-41": {}, "VN-43": {}, + "VN-44": {}, "VN-45": {}, "VN-46": {}, "VN-47": {}, "VN-49": {}, + "VN-50": {}, "VN-51": {}, "VN-52": {}, "VN-53": {}, "VN-54": {}, + "VN-55": {}, "VN-56": {}, "VN-57": {}, "VN-58": {}, "VN-59": {}, + "VN-61": {}, "VN-63": {}, "VN-66": {}, "VN-67": {}, "VN-68": {}, + "VN-69": {}, "VN-70": {}, "VN-71": {}, "VN-72": {}, "VN-73": {}, + "VN-CT": {}, "VN-DN": {}, "VN-HN": {}, "VN-HP": {}, "VN-SG": {}, + "VU-MAP": {}, "VU-PAM": {}, "VU-SAM": {}, "VU-SEE": {}, "VU-TAE": {}, + "VU-TOB": {}, "WF-SG": {}, "WF-UV": {}, "WS-AA": {}, "WS-AL": {}, "WS-AT": {}, "WS-FA": {}, + "WS-GE": {}, "WS-GI": {}, "WS-PA": {}, "WS-SA": {}, "WS-TU": {}, + "WS-VF": {}, "WS-VS": {}, "YE-AB": {}, "YE-AD": {}, "YE-AM": {}, + "YE-BA": {}, "YE-DA": {}, "YE-DH": {}, "YE-HD": {}, "YE-HJ": {}, "YE-HU": {}, + "YE-IB": {}, "YE-JA": {}, "YE-LA": {}, "YE-MA": {}, "YE-MR": {}, + "YE-MU": {}, "YE-MW": {}, "YE-RA": {}, "YE-SA": {}, "YE-SD": {}, "YE-SH": {}, + "YE-SN": {}, "YE-TA": {}, "ZA-EC": {}, "ZA-FS": {}, "ZA-GP": {}, + "ZA-LP": {}, "ZA-MP": {}, "ZA-NC": {}, "ZA-NW": {}, "ZA-WC": {}, + "ZA-ZN": {}, "ZA-KZN": {}, "ZM-01": {}, "ZM-02": {}, "ZM-03": {}, "ZM-04": {}, + "ZM-05": {}, "ZM-06": {}, "ZM-07": {}, "ZM-08": {}, "ZM-09": {}, "ZM-10": {}, + "ZW-BU": {}, "ZW-HA": {}, "ZW-MA": {}, "ZW-MC": {}, "ZW-ME": {}, + "ZW-MI": {}, "ZW-MN": {}, "ZW-MS": {}, "ZW-MV": {}, "ZW-MW": {}, +} diff --git a/vendor/github.com/go-playground/validator/v10/currency_codes.go b/vendor/github.com/go-playground/validator/v10/currency_codes.go new file mode 100644 index 00000000..d0317f89 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/currency_codes.go @@ -0,0 +1,79 @@ +package validator + +var iso4217 = map[string]struct{}{ + "AFN": {}, "EUR": {}, "ALL": {}, "DZD": {}, "USD": {}, + "AOA": {}, "XCD": {}, "ARS": {}, "AMD": {}, "AWG": {}, + "AUD": {}, "AZN": {}, "BSD": {}, "BHD": {}, "BDT": {}, + "BBD": {}, "BYN": {}, "BZD": {}, "XOF": {}, "BMD": {}, + "INR": {}, "BTN": {}, "BOB": {}, "BOV": {}, "BAM": {}, + "BWP": {}, "NOK": {}, "BRL": {}, "BND": {}, "BGN": {}, + "BIF": {}, "CVE": {}, "KHR": {}, "XAF": {}, "CAD": {}, + "KYD": {}, "CLP": {}, "CLF": {}, "CNY": {}, "COP": {}, + "COU": {}, "KMF": {}, "CDF": {}, "NZD": {}, "CRC": {}, + "HRK": {}, "CUP": {}, "CUC": {}, "ANG": {}, "CZK": {}, + "DKK": {}, "DJF": {}, "DOP": {}, "EGP": {}, "SVC": {}, + "ERN": {}, "SZL": {}, "ETB": {}, "FKP": {}, "FJD": {}, + "XPF": {}, "GMD": {}, "GEL": {}, "GHS": {}, "GIP": {}, + "GTQ": {}, "GBP": {}, "GNF": {}, "GYD": {}, "HTG": {}, + "HNL": {}, "HKD": {}, "HUF": {}, "ISK": {}, "IDR": {}, + "XDR": {}, "IRR": {}, "IQD": {}, "ILS": {}, "JMD": {}, + "JPY": {}, "JOD": {}, "KZT": {}, "KES": {}, "KPW": {}, + "KRW": {}, "KWD": {}, "KGS": {}, "LAK": {}, "LBP": {}, + "LSL": {}, "ZAR": {}, "LRD": {}, "LYD": {}, "CHF": {}, + "MOP": {}, "MKD": {}, "MGA": {}, "MWK": {}, "MYR": {}, + "MVR": {}, "MRU": {}, "MUR": {}, "XUA": {}, "MXN": {}, + "MXV": {}, "MDL": {}, "MNT": {}, "MAD": {}, "MZN": {}, + "MMK": {}, "NAD": {}, "NPR": {}, "NIO": {}, "NGN": {}, + "OMR": {}, "PKR": {}, "PAB": {}, "PGK": {}, "PYG": {}, + "PEN": {}, "PHP": {}, "PLN": {}, "QAR": {}, "RON": {}, + "RUB": {}, "RWF": {}, "SHP": {}, "WST": {}, "STN": {}, + "SAR": {}, "RSD": {}, "SCR": {}, "SLL": {}, "SGD": {}, + "XSU": {}, "SBD": {}, "SOS": {}, "SSP": {}, "LKR": {}, + "SDG": {}, "SRD": {}, "SEK": {}, "CHE": {}, "CHW": {}, + "SYP": {}, "TWD": {}, "TJS": {}, "TZS": {}, "THB": {}, + "TOP": {}, "TTD": {}, "TND": {}, "TRY": {}, "TMT": {}, + "UGX": {}, "UAH": {}, "AED": {}, "USN": {}, "UYU": {}, + "UYI": {}, "UYW": {}, "UZS": {}, "VUV": {}, "VES": {}, + "VND": {}, "YER": {}, "ZMW": {}, "ZWL": {}, "XBA": {}, + "XBB": {}, "XBC": {}, "XBD": {}, "XTS": {}, "XXX": {}, + "XAU": {}, "XPD": {}, "XPT": {}, "XAG": {}, +} + +var iso4217_numeric = map[int]struct{}{ + 8: {}, 12: {}, 32: {}, 36: {}, 44: {}, + 48: {}, 50: {}, 51: {}, 52: {}, 60: {}, + 64: {}, 68: {}, 72: {}, 84: {}, 90: {}, + 96: {}, 104: {}, 108: {}, 116: {}, 124: {}, + 132: {}, 136: {}, 144: {}, 152: {}, 156: {}, + 170: {}, 174: {}, 188: {}, 191: {}, 192: {}, + 203: {}, 208: {}, 214: {}, 222: {}, 230: {}, + 232: {}, 238: {}, 242: {}, 262: {}, 270: {}, + 292: {}, 320: {}, 324: {}, 328: {}, 332: {}, + 340: {}, 344: {}, 348: {}, 352: {}, 356: {}, + 360: {}, 364: {}, 368: {}, 376: {}, 388: {}, + 392: {}, 398: {}, 400: {}, 404: {}, 408: {}, + 410: {}, 414: {}, 417: {}, 418: {}, 422: {}, + 426: {}, 430: {}, 434: {}, 446: {}, 454: {}, + 458: {}, 462: {}, 480: {}, 484: {}, 496: {}, + 498: {}, 504: {}, 512: {}, 516: {}, 524: {}, + 532: {}, 533: {}, 548: {}, 554: {}, 558: {}, + 566: {}, 578: {}, 586: {}, 590: {}, 598: {}, + 600: {}, 604: {}, 608: {}, 634: {}, 643: {}, + 646: {}, 654: {}, 682: {}, 690: {}, 694: {}, + 702: {}, 704: {}, 706: {}, 710: {}, 728: {}, + 748: {}, 752: {}, 756: {}, 760: {}, 764: {}, + 776: {}, 780: {}, 784: {}, 788: {}, 800: {}, + 807: {}, 818: {}, 826: {}, 834: {}, 840: {}, + 858: {}, 860: {}, 882: {}, 886: {}, 901: {}, + 927: {}, 928: {}, 929: {}, 930: {}, 931: {}, + 932: {}, 933: {}, 934: {}, 936: {}, 938: {}, + 940: {}, 941: {}, 943: {}, 944: {}, 946: {}, + 947: {}, 948: {}, 949: {}, 950: {}, 951: {}, + 952: {}, 953: {}, 955: {}, 956: {}, 957: {}, + 958: {}, 959: {}, 960: {}, 961: {}, 962: {}, + 963: {}, 964: {}, 965: {}, 967: {}, 968: {}, + 969: {}, 970: {}, 971: {}, 972: {}, 973: {}, + 975: {}, 976: {}, 977: {}, 978: {}, 979: {}, + 980: {}, 981: {}, 984: {}, 985: {}, 986: {}, + 990: {}, 994: {}, 997: {}, 999: {}, +} diff --git a/vendor/github.com/go-playground/validator/v10/doc.go b/vendor/github.com/go-playground/validator/v10/doc.go new file mode 100644 index 00000000..c9b1616e --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/doc.go @@ -0,0 +1,1498 @@ +/* +Package validator implements value validations for structs and individual fields +based on tags. + +It can also handle Cross-Field and Cross-Struct validation for nested structs +and has the ability to dive into arrays and maps of any type. + +see more examples https://github.com/go-playground/validator/tree/master/_examples + +# Singleton + +Validator is designed to be thread-safe and used as a singleton instance. +It caches information about your struct and validations, +in essence only parsing your validation tags once per struct type. +Using multiple instances neglects the benefit of caching. +The not thread-safe functions are explicitly marked as such in the documentation. + +# Validation Functions Return Type error + +Doing things this way is actually the way the standard library does, see the +file.Open method here: + + https://golang.org/pkg/os/#Open. + +The authors return type "error" to avoid the issue discussed in the following, +where err is always != nil: + + http://stackoverflow.com/a/29138676/3158232 + https://github.com/go-playground/validator/issues/134 + +Validator only InvalidValidationError for bad validation input, nil or +ValidationErrors as type error; so, in your code all you need to do is check +if the error returned is not nil, and if it's not check if error is +InvalidValidationError ( if necessary, most of the time it isn't ) type cast +it to type ValidationErrors like so err.(validator.ValidationErrors). + +# Custom Validation Functions + +Custom Validation functions can be added. Example: + + // Structure + func customFunc(fl validator.FieldLevel) bool { + + if fl.Field().String() == "invalid" { + return false + } + + return true + } + + validate.RegisterValidation("custom tag name", customFunc) + // NOTES: using the same tag name as an existing function + // will overwrite the existing one + +# Cross-Field Validation + +Cross-Field Validation can be done via the following tags: + - eqfield + - nefield + - gtfield + - gtefield + - ltfield + - ltefield + - eqcsfield + - necsfield + - gtcsfield + - gtecsfield + - ltcsfield + - ltecsfield + +If, however, some custom cross-field validation is required, it can be done +using a custom validation. + +Why not just have cross-fields validation tags (i.e. only eqcsfield and not +eqfield)? + +The reason is efficiency. If you want to check a field within the same struct +"eqfield" only has to find the field on the same struct (1 level). But, if we +used "eqcsfield" it could be multiple levels down. Example: + + type Inner struct { + StartDate time.Time + } + + type Outer struct { + InnerStructField *Inner + CreatedAt time.Time `validate:"ltecsfield=InnerStructField.StartDate"` + } + + now := time.Now() + + inner := &Inner{ + StartDate: now, + } + + outer := &Outer{ + InnerStructField: inner, + CreatedAt: now, + } + + errs := validate.Struct(outer) + + // NOTE: when calling validate.Struct(val) topStruct will be the top level struct passed + // into the function + // when calling validate.VarWithValue(val, field, tag) val will be + // whatever you pass, struct, field... + // when calling validate.Field(field, tag) val will be nil + +# Multiple Validators + +Multiple validators on a field will process in the order defined. Example: + + type Test struct { + Field `validate:"max=10,min=1"` + } + + // max will be checked then min + +Bad Validator definitions are not handled by the library. Example: + + type Test struct { + Field `validate:"min=10,max=0"` + } + + // this definition of min max will never succeed + +# Using Validator Tags + +Baked In Cross-Field validation only compares fields on the same struct. +If Cross-Field + Cross-Struct validation is needed you should implement your +own custom validator. + +Comma (",") is the default separator of validation tags. If you wish to +have a comma included within the parameter (i.e. excludesall=,) you will need to +use the UTF-8 hex representation 0x2C, which is replaced in the code as a comma, +so the above will become excludesall=0x2C. + + type Test struct { + Field `validate:"excludesall=,"` // BAD! Do not include a comma. + Field `validate:"excludesall=0x2C"` // GOOD! Use the UTF-8 hex representation. + } + +Pipe ("|") is the 'or' validation tags deparator. If you wish to +have a pipe included within the parameter i.e. excludesall=| you will need to +use the UTF-8 hex representation 0x7C, which is replaced in the code as a pipe, +so the above will become excludesall=0x7C + + type Test struct { + Field `validate:"excludesall=|"` // BAD! Do not include a pipe! + Field `validate:"excludesall=0x7C"` // GOOD! Use the UTF-8 hex representation. + } + +# Baked In Validators and Tags + +Here is a list of the current built in validators: + +# Skip Field + +Tells the validation to skip this struct field; this is particularly +handy in ignoring embedded structs from being validated. (Usage: -) + + Usage: - + +# Or Operator + +This is the 'or' operator allowing multiple validators to be used and +accepted. (Usage: rgb|rgba) <-- this would allow either rgb or rgba +colors to be accepted. This can also be combined with 'and' for example +( Usage: omitempty,rgb|rgba) + + Usage: | + +# StructOnly + +When a field that is a nested struct is encountered, and contains this flag +any validation on the nested struct will be run, but none of the nested +struct fields will be validated. This is useful if inside of your program +you know the struct will be valid, but need to verify it has been assigned. +NOTE: only "required" and "omitempty" can be used on a struct itself. + + Usage: structonly + +# NoStructLevel + +Same as structonly tag except that any struct level validations will not run. + + Usage: nostructlevel + +# Omit Empty + +Allows conditional validation, for example if a field is not set with +a value (Determined by the "required" validator) then other validation +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 +level of the slice, array or map with the validation tags that follow. +Multidimensional nesting is also supported, each level you wish to dive will +require another dive tag. dive has some sub-tags, 'keys' & 'endkeys', please see +the Keys & EndKeys section just below. + + Usage: dive + +Example #1 + + [][]string with validation tag "gt=0,dive,len=1,dive,required" + // gt=0 will be applied to [] + // len=1 will be applied to []string + // required will be applied to string + +Example #2 + + [][]string with validation tag "gt=0,dive,dive,required" + // gt=0 will be applied to [] + // []string will be spared validation + // required will be applied to string + +Keys & EndKeys + +These are to be used together directly after the dive tag and tells the validator +that anything between 'keys' and 'endkeys' applies to the keys of a map and not the +values; think of it like the 'dive' tag, but for map keys instead of values. +Multidimensional nesting is also supported, each level you wish to validate will +require another 'keys' and 'endkeys' tag. These tags are only valid for maps. + + Usage: dive,keys,othertagvalidation(s),endkeys,valuevalidationtags + +Example #1 + + map[string]string with validation tag "gt=0,dive,keys,eq=1|eq=2,endkeys,required" + // gt=0 will be applied to the map itself + // eq=1|eq=2 will be applied to the map keys + // required will be applied to map values + +Example #2 + + map[[2]string]string with validation tag "gt=0,dive,keys,dive,eq=1|eq=2,endkeys,required" + // gt=0 will be applied to the map itself + // eq=1|eq=2 will be applied to each array element in the map keys + // required will be applied to map values + +# Required + +This validates that the value is not the data types default zero value. +For numbers ensures value is not zero. For strings ensures value is +not "". For booleans ensures value is not false. For slices, maps, pointers, interfaces, channels and functions +ensures the value is not nil. For structs ensures value is not the zero value when using WithRequiredStructEnabled. + + Usage: required + +# Required If + +The field under validation must be present and not empty only if all +the other specified fields are equal to the value following the specified +field. For strings ensures value is not "". For slices, maps, pointers, +interfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value. + + Usage: required_if + +Examples: + + // require the field if the Field1 is equal to the parameter given: + Usage: required_if=Field1 foobar + + // require the field if the Field1 and Field2 is equal to the value respectively: + Usage: required_if=Field1 foo Field2 bar + +# Required Unless + +The field under validation must be present and not empty unless all +the other specified fields are equal to the value following the specified +field. For strings ensures value is not "". For slices, maps, pointers, +interfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value. + + Usage: required_unless + +Examples: + + // require the field unless the Field1 is equal to the parameter given: + Usage: required_unless=Field1 foobar + + // require the field unless the Field1 and Field2 is equal to the value respectively: + Usage: required_unless=Field1 foo Field2 bar + +# Required With + +The field under validation must be present and not empty only if any +of the other specified fields are present. For strings ensures value is +not "". For slices, maps, pointers, interfaces, channels and functions +ensures the value is not nil. For structs ensures value is not the zero value. + + Usage: required_with + +Examples: + + // require the field if the Field1 is present: + Usage: required_with=Field1 + + // require the field if the Field1 or Field2 is present: + Usage: required_with=Field1 Field2 + +# Required With All + +The field under validation must be present and not empty only if all +of the other specified fields are present. For strings ensures value is +not "". For slices, maps, pointers, interfaces, channels and functions +ensures the value is not nil. For structs ensures value is not the zero value. + + Usage: required_with_all + +Example: + + // require the field if the Field1 and Field2 is present: + Usage: required_with_all=Field1 Field2 + +# Required Without + +The field under validation must be present and not empty only when any +of the other specified fields are not present. For strings ensures value is +not "". For slices, maps, pointers, interfaces, channels and functions +ensures the value is not nil. For structs ensures value is not the zero value. + + Usage: required_without + +Examples: + + // require the field if the Field1 is not present: + Usage: required_without=Field1 + + // require the field if the Field1 or Field2 is not present: + Usage: required_without=Field1 Field2 + +# Required Without All + +The field under validation must be present and not empty only when all +of the other specified fields are not present. For strings ensures value is +not "". For slices, maps, pointers, interfaces, channels and functions +ensures the value is not nil. For structs ensures value is not the zero value. + + Usage: required_without_all + +Example: + + // require the field if the Field1 and Field2 is not present: + Usage: required_without_all=Field1 Field2 + +# Excluded If + +The field under validation must not be present or not empty only if all +the other specified fields are equal to the value following the specified +field. For strings ensures value is not "". For slices, maps, pointers, +interfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value. + + Usage: excluded_if + +Examples: + + // exclude the field if the Field1 is equal to the parameter given: + Usage: excluded_if=Field1 foobar + + // exclude the field if the Field1 and Field2 is equal to the value respectively: + Usage: excluded_if=Field1 foo Field2 bar + +# Excluded Unless + +The field under validation must not be present or empty unless all +the other specified fields are equal to the value following the specified +field. For strings ensures value is not "". For slices, maps, pointers, +interfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value. + + Usage: excluded_unless + +Examples: + + // exclude the field unless the Field1 is equal to the parameter given: + Usage: excluded_unless=Field1 foobar + + // exclude the field unless the Field1 and Field2 is equal to the value respectively: + Usage: excluded_unless=Field1 foo Field2 bar + +# Is Default + +This validates that the value is the default value and is almost the +opposite of required. + + Usage: isdefault + +# Length + +For numbers, length will ensure that the value is +equal to the parameter given. For strings, it checks that +the string length is exactly that number of characters. For slices, +arrays, and maps, validates the number of items. + +Example #1 + + Usage: len=10 + +Example #2 (time.Duration) + +For time.Duration, len will ensure that the value is equal to the duration given +in the parameter. + + Usage: len=1h30m + +# Maximum + +For numbers, max will ensure that the value is +less than or equal to the parameter given. For strings, it checks +that the string length is at most that number of characters. For +slices, arrays, and maps, validates the number of items. + +Example #1 + + Usage: max=10 + +Example #2 (time.Duration) + +For time.Duration, max will ensure that the value is less than or equal to the +duration given in the parameter. + + Usage: max=1h30m + +# Minimum + +For numbers, min will ensure that the value is +greater or equal to the parameter given. For strings, it checks that +the string length is at least that number of characters. For slices, +arrays, and maps, validates the number of items. + +Example #1 + + Usage: min=10 + +Example #2 (time.Duration) + +For time.Duration, min will ensure that the value is greater than or equal to +the duration given in the parameter. + + Usage: min=1h30m + +# Equals + +For strings & numbers, eq will ensure that the value is +equal to the parameter given. For slices, arrays, and maps, +validates the number of items. + +Example #1 + + Usage: eq=10 + +Example #2 (time.Duration) + +For time.Duration, eq will ensure that the value is equal to the duration given +in the parameter. + + Usage: eq=1h30m + +# Not Equal + +For strings & numbers, ne will ensure that the value is not +equal to the parameter given. For slices, arrays, and maps, +validates the number of items. + +Example #1 + + Usage: ne=10 + +Example #2 (time.Duration) + +For time.Duration, ne will ensure that the value is not equal to the duration +given in the parameter. + + Usage: ne=1h30m + +# One Of + +For strings, ints, and uints, oneof will ensure that the value +is one of the values in the parameter. The parameter should be +a list of values separated by whitespace. Values may be +strings or numbers. To match strings with spaces in them, include +the target string between single quotes. Kind of like an 'enum'. + + Usage: oneof=red green + oneof='red green' 'blue yellow' + oneof=5 7 9 + +# One Of Case Insensitive + +Works the same as oneof but is case insensitive and therefore only accepts strings. + + Usage: oneofci=red green + oneofci='red green' 'blue yellow' + +# Greater Than + +For numbers, this will ensure that the value is greater than the +parameter given. For strings, it checks that the string length +is greater than that number of characters. For slices, arrays +and maps it validates the number of items. + +Example #1 + + Usage: gt=10 + +Example #2 (time.Time) + +For time.Time ensures the time value is greater than time.Now.UTC(). + + Usage: gt + +Example #3 (time.Duration) + +For time.Duration, gt will ensure that the value is greater than the duration +given in the parameter. + + Usage: gt=1h30m + +# Greater Than or Equal + +Same as 'min' above. Kept both to make terminology with 'len' easier. + +Example #1 + + Usage: gte=10 + +Example #2 (time.Time) + +For time.Time ensures the time value is greater than or equal to time.Now.UTC(). + + Usage: gte + +Example #3 (time.Duration) + +For time.Duration, gte will ensure that the value is greater than or equal to +the duration given in the parameter. + + Usage: gte=1h30m + +# Less Than + +For numbers, this will ensure that the value is less than the parameter given. +For strings, it checks that the string length is less than that number of +characters. For slices, arrays, and maps it validates the number of items. + +Example #1 + + Usage: lt=10 + +Example #2 (time.Time) + +For time.Time ensures the time value is less than time.Now.UTC(). + + Usage: lt + +Example #3 (time.Duration) + +For time.Duration, lt will ensure that the value is less than the duration given +in the parameter. + + Usage: lt=1h30m + +# Less Than or Equal + +Same as 'max' above. Kept both to make terminology with 'len' easier. + +Example #1 + + Usage: lte=10 + +Example #2 (time.Time) + +For time.Time ensures the time value is less than or equal to time.Now.UTC(). + + Usage: lte + +Example #3 (time.Duration) + +For time.Duration, lte will ensure that the value is less than or equal to the +duration given in the parameter. + + Usage: lte=1h30m + +# Field Equals Another Field + +This will validate the field value against another fields value either within +a struct or passed in field. + +Example #1: + + // Validation on Password field using: + Usage: eqfield=ConfirmPassword + +Example #2: + + // Validating by field: + validate.VarWithValue(password, confirmpassword, "eqfield") + +Field Equals Another Field (relative) + +This does the same as eqfield except that it validates the field provided relative +to the top level struct. + + Usage: eqcsfield=InnerStructField.Field) + +# Field Does Not Equal Another Field + +This will validate the field value against another fields value either within +a struct or passed in field. + +Examples: + + // Confirm two colors are not the same: + // + // Validation on Color field: + Usage: nefield=Color2 + + // Validating by field: + validate.VarWithValue(color1, color2, "nefield") + +Field Does Not Equal Another Field (relative) + +This does the same as nefield except that it validates the field provided +relative to the top level struct. + + Usage: necsfield=InnerStructField.Field + +# Field Greater Than Another Field + +Only valid for Numbers, time.Duration and time.Time types, this will validate +the field value against another fields value either within a struct or passed in +field. usage examples are for validation of a Start and End date: + +Example #1: + + // Validation on End field using: + validate.Struct Usage(gtfield=Start) + +Example #2: + + // Validating by field: + validate.VarWithValue(start, end, "gtfield") + +# Field Greater Than Another Relative Field + +This does the same as gtfield except that it validates the field provided +relative to the top level struct. + + Usage: gtcsfield=InnerStructField.Field + +# Field Greater Than or Equal To Another Field + +Only valid for Numbers, time.Duration and time.Time types, this will validate +the field value against another fields value either within a struct or passed in +field. usage examples are for validation of a Start and End date: + +Example #1: + + // Validation on End field using: + validate.Struct Usage(gtefield=Start) + +Example #2: + + // Validating by field: + validate.VarWithValue(start, end, "gtefield") + +# Field Greater Than or Equal To Another Relative Field + +This does the same as gtefield except that it validates the field provided relative +to the top level struct. + + Usage: gtecsfield=InnerStructField.Field + +# Less Than Another Field + +Only valid for Numbers, time.Duration and time.Time types, this will validate +the field value against another fields value either within a struct or passed in +field. usage examples are for validation of a Start and End date: + +Example #1: + + // Validation on End field using: + validate.Struct Usage(ltfield=Start) + +Example #2: + + // Validating by field: + validate.VarWithValue(start, end, "ltfield") + +# Less Than Another Relative Field + +This does the same as ltfield except that it validates the field provided relative +to the top level struct. + + Usage: ltcsfield=InnerStructField.Field + +# Less Than or Equal To Another Field + +Only valid for Numbers, time.Duration and time.Time types, this will validate +the field value against another fields value either within a struct or passed in +field. usage examples are for validation of a Start and End date: + +Example #1: + + // Validation on End field using: + validate.Struct Usage(ltefield=Start) + +Example #2: + + // Validating by field: + validate.VarWithValue(start, end, "ltefield") + +# Less Than or Equal To Another Relative Field + +This does the same as ltefield except that it validates the field provided relative +to the top level struct. + + Usage: ltecsfield=InnerStructField.Field + +# Field Contains Another Field + +This does the same as contains except for struct fields. It should only be used +with string types. See the behavior of reflect.Value.String() for behavior on +other types. + + Usage: containsfield=InnerStructField.Field + +# Field Excludes Another Field + +This does the same as excludes except for struct fields. It should only be used +with string types. See the behavior of reflect.Value.String() for behavior on +other types. + + Usage: excludesfield=InnerStructField.Field + +# Unique + +For arrays & slices, unique will ensure that there are no duplicates. +For maps, unique will ensure that there are no duplicate values. +For slices of struct, unique will ensure that there are no duplicate values +in a field of the struct specified via a parameter. + + // For arrays, slices, and maps: + Usage: unique + + // For slices of struct: + Usage: unique=field + +# Alpha Only + +This validates that a string value contains ASCII alpha characters only + + Usage: alpha + +# Alphanumeric + +This validates that a string value contains ASCII alphanumeric characters only + + Usage: alphanum + +# Alpha Unicode + +This validates that a string value contains unicode alpha characters only + + Usage: alphaunicode + +# Alphanumeric Unicode + +This validates that a string value contains unicode alphanumeric characters only + + Usage: alphanumunicode + +# Boolean + +This validates that a string value can successfully be parsed into a boolean with strconv.ParseBool + + Usage: boolean + +# Number + +This validates that a string value contains number values only. +For integers or float it returns true. + + Usage: number + +# Numeric + +This validates that a string value contains a basic numeric value. +basic excludes exponents etc... +for integers or float it returns true. + + Usage: numeric + +# Hexadecimal String + +This validates that a string value contains a valid hexadecimal. + + Usage: hexadecimal + +# Hexcolor String + +This validates that a string value contains a valid hex color including +hashtag (#) + + Usage: hexcolor + +# Lowercase String + +This validates that a string value contains only lowercase characters. An empty string is not a valid lowercase string. + + Usage: lowercase + +# Uppercase String + +This validates that a string value contains only uppercase characters. An empty string is not a valid uppercase string. + + Usage: uppercase + +# RGB String + +This validates that a string value contains a valid rgb color + + Usage: rgb + +# RGBA String + +This validates that a string value contains a valid rgba color + + Usage: rgba + +# HSL String + +This validates that a string value contains a valid hsl color + + Usage: hsl + +# HSLA String + +This validates that a string value contains a valid hsla color + + Usage: hsla + +# E.164 Phone Number String + +This validates that a string value contains a valid E.164 Phone number +https://en.wikipedia.org/wiki/E.164 (ex. +1123456789) + + Usage: e164 + +# E-mail String + +This validates that a string value contains a valid email +This may not conform to all possibilities of any rfc standard, but neither +does any email provider accept all possibilities. + + Usage: email + +# JSON String + +This validates that a string value is valid JSON + + Usage: json + +# JWT String + +This validates that a string value is a valid JWT + + Usage: jwt + +# File + +This validates that a string value contains a valid file path and that +the file exists on the machine. +This is done using os.Stat, which is a platform independent function. + + Usage: file + +# Image path + +This validates that a string value contains a valid file path and that +the file exists on the machine and is an image. +This is done using os.Stat and github.com/gabriel-vasile/mimetype + + Usage: image + +# File Path + +This validates that a string value contains a valid file path but does not +validate the existence of that file. +This is done using os.Stat, which is a platform independent function. + + Usage: filepath + +# URL String + +This validates that a string value contains a valid url +This will accept any url the golang request uri accepts but must contain +a schema for example http:// or rtmp:// + + Usage: url + +# URI String + +This validates that a string value contains a valid uri +This will accept any uri the golang request uri accepts + + Usage: uri + +# Urn RFC 2141 String + +This validates that a string value contains a valid URN +according to the RFC 2141 spec. + + Usage: urn_rfc2141 + +# Base32 String + +This validates that a string value contains a valid bas324 value. +Although an empty string is valid base32 this will report an empty string +as an error, if you wish to accept an empty string as valid you can use +this with the omitempty tag. + + Usage: base32 + +# Base64 String + +This validates that a string value contains a valid base64 value. +Although an empty string is valid base64 this will report an empty string +as an error, if you wish to accept an empty string as valid you can use +this with the omitempty tag. + + Usage: base64 + +# Base64URL String + +This validates that a string value contains a valid base64 URL safe value +according the RFC4648 spec. +Although an empty string is a valid base64 URL safe value, this will report +an empty string as an error, if you wish to accept an empty string as valid +you can use this with the omitempty tag. + + Usage: base64url + +# Base64RawURL String + +This validates that a string value contains a valid base64 URL safe value, +but without = padding, according the RFC4648 spec, section 3.2. +Although an empty string is a valid base64 URL safe value, this will report +an empty string as an error, if you wish to accept an empty string as valid +you can use this with the omitempty tag. + + Usage: base64url + +# Bitcoin Address + +This validates that a string value contains a valid bitcoin address. +The format of the string is checked to ensure it matches one of the three formats +P2PKH, P2SH and performs checksum validation. + + Usage: btc_addr + +Bitcoin Bech32 Address (segwit) + +This validates that a string value contains a valid bitcoin Bech32 address as defined +by bip-0173 (https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki) +Special thanks to Pieter Wuille for providing reference implementations. + + Usage: btc_addr_bech32 + +# Ethereum Address + +This validates that a string value contains a valid ethereum address. +The format of the string is checked to ensure it matches the standard Ethereum address format. + + Usage: eth_addr + +# Contains + +This validates that a string value contains the substring value. + + Usage: contains=@ + +# Contains Any + +This validates that a string value contains any Unicode code points +in the substring value. + + Usage: containsany=!@#? + +# Contains Rune + +This validates that a string value contains the supplied rune value. + + Usage: containsrune=@ + +# Excludes + +This validates that a string value does not contain the substring value. + + Usage: excludes=@ + +# Excludes All + +This validates that a string value does not contain any Unicode code +points in the substring value. + + Usage: excludesall=!@#? + +# Excludes Rune + +This validates that a string value does not contain the supplied rune value. + + Usage: excludesrune=@ + +# Starts With + +This validates that a string value starts with the supplied string value + + Usage: startswith=hello + +# Ends With + +This validates that a string value ends with the supplied string value + + Usage: endswith=goodbye + +# Does Not Start With + +This validates that a string value does not start with the supplied string value + + Usage: startsnotwith=hello + +# Does Not End With + +This validates that a string value does not end with the supplied string value + + Usage: endsnotwith=goodbye + +# International Standard Book Number + +This validates that a string value contains a valid isbn10 or isbn13 value. + + Usage: isbn + +# International Standard Book Number 10 + +This validates that a string value contains a valid isbn10 value. + + Usage: isbn10 + +# International Standard Book Number 13 + +This validates that a string value contains a valid isbn13 value. + + Usage: isbn13 + +# Universally Unique Identifier UUID + +This validates that a string value contains a valid UUID. Uppercase UUID values will not pass - use `uuid_rfc4122` instead. + + Usage: uuid + +# Universally Unique Identifier UUID v3 + +This validates that a string value contains a valid version 3 UUID. Uppercase UUID values will not pass - use `uuid3_rfc4122` instead. + + Usage: uuid3 + +# Universally Unique Identifier UUID v4 + +This validates that a string value contains a valid version 4 UUID. Uppercase UUID values will not pass - use `uuid4_rfc4122` instead. + + Usage: uuid4 + +# Universally Unique Identifier UUID v5 + +This validates that a string value contains a valid version 5 UUID. Uppercase UUID values will not pass - use `uuid5_rfc4122` instead. + + Usage: uuid5 + +# Universally Unique Lexicographically Sortable Identifier ULID + +This validates that a string value contains a valid ULID value. + + Usage: ulid + +# ASCII + +This validates that a string value contains only ASCII characters. +NOTE: if the string is blank, this validates as true. + + Usage: ascii + +# Printable ASCII + +This validates that a string value contains only printable ASCII characters. +NOTE: if the string is blank, this validates as true. + + Usage: printascii + +# Multi-Byte Characters + +This validates that a string value contains one or more multibyte characters. +NOTE: if the string is blank, this validates as true. + + Usage: multibyte + +# Data URL + +This validates that a string value contains a valid DataURI. +NOTE: this will also validate that the data portion is valid base64 + + Usage: datauri + +# Latitude + +This validates that a string value contains a valid latitude. + + Usage: latitude + +# Longitude + +This validates that a string value contains a valid longitude. + + Usage: longitude + +# Social Security Number SSN + +This validates that a string value contains a valid U.S. Social Security Number. + + Usage: ssn + +# Internet Protocol Address IP + +This validates that a string value contains a valid IP Address. + + Usage: ip + +# Internet Protocol Address IPv4 + +This validates that a string value contains a valid v4 IP Address. + + Usage: ipv4 + +# Internet Protocol Address IPv6 + +This validates that a string value contains a valid v6 IP Address. + + Usage: ipv6 + +# Classless Inter-Domain Routing CIDR + +This validates that a string value contains a valid CIDR Address. + + Usage: cidr + +# Classless Inter-Domain Routing CIDRv4 + +This validates that a string value contains a valid v4 CIDR Address. + + Usage: cidrv4 + +# Classless Inter-Domain Routing CIDRv6 + +This validates that a string value contains a valid v6 CIDR Address. + + Usage: cidrv6 + +# Transmission Control Protocol Address TCP + +This validates that a string value contains a valid resolvable TCP Address. + + Usage: tcp_addr + +# Transmission Control Protocol Address TCPv4 + +This validates that a string value contains a valid resolvable v4 TCP Address. + + Usage: tcp4_addr + +# Transmission Control Protocol Address TCPv6 + +This validates that a string value contains a valid resolvable v6 TCP Address. + + Usage: tcp6_addr + +# User Datagram Protocol Address UDP + +This validates that a string value contains a valid resolvable UDP Address. + + Usage: udp_addr + +# User Datagram Protocol Address UDPv4 + +This validates that a string value contains a valid resolvable v4 UDP Address. + + Usage: udp4_addr + +# User Datagram Protocol Address UDPv6 + +This validates that a string value contains a valid resolvable v6 UDP Address. + + Usage: udp6_addr + +# Internet Protocol Address IP + +This validates that a string value contains a valid resolvable IP Address. + + Usage: ip_addr + +# Internet Protocol Address IPv4 + +This validates that a string value contains a valid resolvable v4 IP Address. + + Usage: ip4_addr + +# Internet Protocol Address IPv6 + +This validates that a string value contains a valid resolvable v6 IP Address. + + Usage: ip6_addr + +# Unix domain socket end point Address + +This validates that a string value contains a valid Unix Address. + + Usage: unix_addr + +# Media Access Control Address MAC + +This validates that a string value contains a valid MAC Address. + + Usage: mac + +Note: See Go's ParseMAC for accepted formats and types: + + http://golang.org/src/net/mac.go?s=866:918#L29 + +# Hostname RFC 952 + +This validates that a string value is a valid Hostname according to RFC 952 https://tools.ietf.org/html/rfc952 + + Usage: hostname + +# Hostname RFC 1123 + +This validates that a string value is a valid Hostname according to RFC 1123 https://tools.ietf.org/html/rfc1123 + + Usage: hostname_rfc1123 or if you want to continue to use 'hostname' in your tags, create an alias. + +Full Qualified Domain Name (FQDN) + +This validates that a string value contains a valid FQDN. + + Usage: fqdn + +# HTML Tags + +This validates that a string value appears to be an HTML element tag +including those described at https://developer.mozilla.org/en-US/docs/Web/HTML/Element + + Usage: html + +# HTML Encoded + +This validates that a string value is a proper character reference in decimal +or hexadecimal format + + Usage: html_encoded + +# URL Encoded + +This validates that a string value is percent-encoded (URL encoded) according +to https://tools.ietf.org/html/rfc3986#section-2.1 + + Usage: url_encoded + +# Directory + +This validates that a string value contains a valid directory and that +it exists on the machine. +This is done using os.Stat, which is a platform independent function. + + Usage: dir + +# Directory Path + +This validates that a string value contains a valid directory but does +not validate the existence of that directory. +This is done using os.Stat, which is a platform independent function. +It is safest to suffix the string with os.PathSeparator if the directory +may not exist at the time of validation. + + Usage: dirpath + +# HostPort + +This validates that a string value contains a valid DNS hostname and port that +can be used to validate fields typically passed to sockets and connections. + + Usage: hostname_port + +# Datetime + +This validates that a string value is a valid datetime based on the supplied datetime format. +Supplied format must match the official Go time format layout as documented in https://golang.org/pkg/time/ + + Usage: datetime=2006-01-02 + +# Iso3166-1 alpha-2 + +This validates that a string value is a valid country code based on iso3166-1 alpha-2 standard. +see: https://www.iso.org/iso-3166-country-codes.html + + Usage: iso3166_1_alpha2 + +# Iso3166-1 alpha-3 + +This validates that a string value is a valid country code based on iso3166-1 alpha-3 standard. +see: https://www.iso.org/iso-3166-country-codes.html + + Usage: iso3166_1_alpha3 + +# Iso3166-1 alpha-numeric + +This validates that a string value is a valid country code based on iso3166-1 alpha-numeric standard. +see: https://www.iso.org/iso-3166-country-codes.html + + Usage: iso3166_1_alpha3 + +# BCP 47 Language Tag + +This validates that a string value is a valid BCP 47 language tag, as parsed by language.Parse. +More information on https://pkg.go.dev/golang.org/x/text/language + + Usage: bcp47_language_tag + +BIC (SWIFT code) + +This validates that a string value is a valid Business Identifier Code (SWIFT code), defined in ISO 9362. +More information on https://www.iso.org/standard/60390.html + + Usage: bic + +# RFC 1035 label + +This validates that a string value is a valid dns RFC 1035 label, defined in RFC 1035. +More information on https://datatracker.ietf.org/doc/html/rfc1035 + + Usage: dns_rfc1035_label + +# TimeZone + +This validates that a string value is a valid time zone based on the time zone database present on the system. +Although empty value and Local value are allowed by time.LoadLocation golang function, they are not allowed by this validator. +More information on https://golang.org/pkg/time/#LoadLocation + + Usage: timezone + +# Semantic Version + +This validates that a string value is a valid semver version, defined in Semantic Versioning 2.0.0. +More information on https://semver.org/ + + Usage: semver + +# CVE Identifier + +This validates that a string value is a valid cve id, defined in cve mitre. +More information on https://cve.mitre.org/ + + Usage: cve + +# Credit Card + +This validates that a string value contains a valid credit card number using Luhn algorithm. + + Usage: credit_card + +# Luhn Checksum + + Usage: luhn_checksum + +This validates that a string or (u)int value contains a valid checksum using the Luhn algorithm. + +# MongoDB + +This validates that a string is a valid 24 character hexadecimal string or valid connection string. + + Usage: mongodb + mongodb_connection_string + +Example: + + type Test struct { + ObjectIdField string `validate:"mongodb"` + ConnectionStringField string `validate:"mongodb_connection_string"` + } + +# Cron + +This validates that a string value contains a valid cron expression. + + Usage: cron + +# SpiceDb ObjectID/Permission/Object Type + +This validates that a string is valid for use with SpiceDb for the indicated purpose. If no purpose is given, a purpose of 'id' is assumed. + + Usage: spicedb=id|permission|type + +# Alias Validators and Tags + +Alias Validators and Tags +NOTE: When returning an error, the tag returned in "FieldError" will be +the alias tag unless the dive tag is part of the alias. Everything after the +dive tag is not reported as the alias tag. Also, the "ActualTag" in the before +case will be the actual tag within the alias that failed. + +Here is a list of the current built in alias tags: + + "iscolor" + alias is "hexcolor|rgb|rgba|hsl|hsla" (Usage: iscolor) + "country_code" + alias is "iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric" (Usage: country_code) + +Validator notes: + + regex + a regex validator won't be added because commas and = signs can be part + of a regex which conflict with the validation definitions. Although + workarounds can be made, they take away from using pure regex's. + Furthermore it's quick and dirty but the regex's become harder to + maintain and are not reusable, so it's as much a programming philosophy + as anything. + + In place of this new validator functions should be created; a regex can + be used within the validator function and even be precompiled for better + efficiency within regexes.go. + + And the best reason, you can submit a pull request and we can keep on + adding to the validation library of this package! + +# Non standard validators + +A collection of validation rules that are frequently needed but are more +complex than the ones found in the baked in validators. +A non standard validator must be registered manually like you would +with your own custom validation functions. + +Example of registration and use: + + type Test struct { + TestField string `validate:"yourtag"` + } + + t := &Test{ + TestField: "Test" + } + + validate := validator.New() + validate.RegisterValidation("yourtag", validators.NotBlank) + +Here is a list of the current non standard validators: + + NotBlank + This validates that the value is not blank or with length zero. + For strings ensures they do not contain only spaces. For channels, maps, slices and arrays + ensures they don't have zero length. For others, a non empty value is required. + + Usage: notblank + +# Panics + +This package panics when bad input is provided, this is by design, bad code like +that should not make it to production. + + type Test struct { + TestField string `validate:"nonexistantfunction=1"` + } + + t := &Test{ + TestField: "Test" + } + + validate.Struct(t) // this will panic +*/ +package validator diff --git a/vendor/github.com/go-playground/validator/v10/errors.go b/vendor/github.com/go-playground/validator/v10/errors.go new file mode 100644 index 00000000..be2676e9 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/errors.go @@ -0,0 +1,276 @@ +package validator + +import ( + "bytes" + "fmt" + "reflect" + "strings" + + ut "github.com/go-playground/universal-translator" +) + +const ( + fieldErrMsg = "Key: '%s' Error:Field validation for '%s' failed on the '%s' tag" +) + +// ValidationErrorsTranslations is the translation return type +type ValidationErrorsTranslations map[string]string + +// InvalidValidationError describes an invalid argument passed to +// `Struct`, `StructExcept`, StructPartial` or `Field` +type InvalidValidationError struct { + Type reflect.Type +} + +// Error returns InvalidValidationError message +func (e *InvalidValidationError) Error() string { + + if e.Type == nil { + return "validator: (nil)" + } + + return "validator: (nil " + e.Type.String() + ")" +} + +// ValidationErrors is an array of FieldError's +// for use in custom error messages post validation. +type ValidationErrors []FieldError + +// Error is intended for use in development + debugging and not intended to be a production error message. +// It allows ValidationErrors to subscribe to the Error interface. +// All information to create an error message specific to your application is contained within +// the FieldError found within the ValidationErrors array +func (ve ValidationErrors) Error() string { + + buff := bytes.NewBufferString("") + + for i := 0; i < len(ve); i++ { + + buff.WriteString(ve[i].Error()) + buff.WriteString("\n") + } + + return strings.TrimSpace(buff.String()) +} + +// Translate translates all of the ValidationErrors +func (ve ValidationErrors) Translate(ut ut.Translator) ValidationErrorsTranslations { + + trans := make(ValidationErrorsTranslations) + + var fe *fieldError + + for i := 0; i < len(ve); i++ { + fe = ve[i].(*fieldError) + + // // in case an Anonymous struct was used, ensure that the key + // // would be 'Username' instead of ".Username" + // if len(fe.ns) > 0 && fe.ns[:1] == "." { + // trans[fe.ns[1:]] = fe.Translate(ut) + // continue + // } + + trans[fe.ns] = fe.Translate(ut) + } + + return trans +} + +// FieldError contains all functions to get error details +type FieldError interface { + + // Tag returns the validation tag that failed. if the + // validation was an alias, this will return the + // alias name and not the underlying tag that failed. + // + // eg. alias "iscolor": "hexcolor|rgb|rgba|hsl|hsla" + // will return "iscolor" + Tag() string + + // ActualTag returns the validation tag that failed, even if an + // alias the actual tag within the alias will be returned. + // If an 'or' validation fails the entire or will be returned. + // + // eg. alias "iscolor": "hexcolor|rgb|rgba|hsl|hsla" + // will return "hexcolor|rgb|rgba|hsl|hsla" + ActualTag() string + + // Namespace returns the namespace for the field error, with the tag + // name taking precedence over the field's actual name. + // + // eg. JSON name "User.fname" + // + // See StructNamespace() for a version that returns actual names. + // + // NOTE: this field can be blank when validating a single primitive field + // using validate.Field(...) as there is no way to extract it's name + Namespace() string + + // StructNamespace returns the namespace for the field error, with the field's + // actual name. + // + // eq. "User.FirstName" see Namespace for comparison + // + // NOTE: this field can be blank when validating a single primitive field + // using validate.Field(...) as there is no way to extract its name + StructNamespace() string + + // Field returns the fields name with the tag name taking precedence over the + // field's actual name. + // + // eq. JSON name "fname" + // see StructField for comparison + Field() string + + // StructField returns the field's actual name from the struct, when able to determine. + // + // eq. "FirstName" + // see Field for comparison + StructField() string + + // Value returns the actual field's value in case needed for creating the error + // message + Value() interface{} + + // Param returns the param value, in string form for comparison; this will also + // help with generating an error message + Param() string + + // Kind returns the Field's reflect Kind + // + // eg. time.Time's kind is a struct + Kind() reflect.Kind + + // Type returns the Field's reflect Type + // + // eg. time.Time's type is time.Time + Type() reflect.Type + + // Translate returns the FieldError's translated error + // from the provided 'ut.Translator' and registered 'TranslationFunc' + // + // NOTE: if no registered translator can be found it returns the same as + // calling fe.Error() + Translate(ut ut.Translator) string + + // Error returns the FieldError's message + Error() string +} + +// compile time interface checks +var _ FieldError = new(fieldError) +var _ error = new(fieldError) + +// fieldError contains a single field's validation error along +// with other properties that may be needed for error message creation +// it complies with the FieldError interface +type fieldError struct { + v *Validate + tag string + actualTag string + ns string + structNs string + fieldLen uint8 + structfieldLen uint8 + value interface{} + param string + kind reflect.Kind + typ reflect.Type +} + +// Tag returns the validation tag that failed. +func (fe *fieldError) Tag() string { + return fe.tag +} + +// ActualTag returns the validation tag that failed, even if an +// alias the actual tag within the alias will be returned. +func (fe *fieldError) ActualTag() string { + return fe.actualTag +} + +// Namespace returns the namespace for the field error, with the tag +// name taking precedence over the field's actual name. +func (fe *fieldError) Namespace() string { + return fe.ns +} + +// StructNamespace returns the namespace for the field error, with the field's +// actual name. +func (fe *fieldError) StructNamespace() string { + return fe.structNs +} + +// Field returns the field's name with the tag name taking precedence over the +// field's actual name. +func (fe *fieldError) Field() string { + + return fe.ns[len(fe.ns)-int(fe.fieldLen):] + // // return fe.field + // fld := fe.ns[len(fe.ns)-int(fe.fieldLen):] + + // log.Println("FLD:", fld) + + // if len(fld) > 0 && fld[:1] == "." { + // return fld[1:] + // } + + // return fld +} + +// StructField returns the field's actual name from the struct, when able to determine. +func (fe *fieldError) StructField() string { + // return fe.structField + return fe.structNs[len(fe.structNs)-int(fe.structfieldLen):] +} + +// Value returns the actual field's value in case needed for creating the error +// message +func (fe *fieldError) Value() interface{} { + return fe.value +} + +// Param returns the param value, in string form for comparison; this will +// also help with generating an error message +func (fe *fieldError) Param() string { + return fe.param +} + +// Kind returns the Field's reflect Kind +func (fe *fieldError) Kind() reflect.Kind { + return fe.kind +} + +// Type returns the Field's reflect Type +func (fe *fieldError) Type() reflect.Type { + return fe.typ +} + +// Error returns the fieldError's error message +func (fe *fieldError) Error() string { + return fmt.Sprintf(fieldErrMsg, fe.ns, fe.Field(), fe.tag) +} + +// Translate returns the FieldError's translated error +// from the provided 'ut.Translator' and registered 'TranslationFunc' +// +// NOTE: if no registered translation can be found, it returns the original +// untranslated error message. +func (fe *fieldError) Translate(ut ut.Translator) string { + var fn TranslationFunc + + m, ok := fe.v.transTagFunc[ut] + if !ok { + return fe.Error() + } + + fn, ok = m[fe.tag] + if !ok { + fn, ok = m[fe.actualTag] + if !ok { + return fe.Error() + } + } + + return fn(ut, fe) +} diff --git a/vendor/github.com/go-playground/validator/v10/field_level.go b/vendor/github.com/go-playground/validator/v10/field_level.go new file mode 100644 index 00000000..ef35826e --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/field_level.go @@ -0,0 +1,120 @@ +package validator + +import "reflect" + +// FieldLevel contains all the information and helper functions +// to validate a field +type FieldLevel interface { + + // Top returns the top level struct, if any + Top() reflect.Value + + // Parent returns the current fields parent struct, if any or + // the comparison value if called 'VarWithValue' + Parent() reflect.Value + + // Field returns current field for validation + Field() reflect.Value + + // FieldName returns the field's name with the tag + // name taking precedence over the fields actual name. + FieldName() string + + // StructFieldName returns the struct field's name + StructFieldName() string + + // Param returns param for validation against current field + Param() string + + // GetTag returns the current validations tag name + GetTag() string + + // ExtractType gets the actual underlying type of field value. + // It will dive into pointers, customTypes and return you the + // underlying value and it's kind. + ExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool) + + // GetStructFieldOK traverses the parent struct to retrieve a specific field denoted by the provided namespace + // in the param and returns the field, field kind and whether is was successful in retrieving + // the field at all. + // + // NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field + // could not be retrieved because it didn't exist. + // + // Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable. + GetStructFieldOK() (reflect.Value, reflect.Kind, bool) + + // GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for + // the field and namespace allowing more extensibility for validators. + // + // Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable. + GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool) + + // GetStructFieldOK2 traverses the parent struct to retrieve a specific field denoted by the provided namespace + // in the param and returns the field, field kind, if it's a nullable type and whether is was successful in retrieving + // the field at all. + // + // NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field + // could not be retrieved because it didn't exist. + GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool) + + // GetStructFieldOKAdvanced2 is the same as GetStructFieldOK except that it accepts the parent struct to start looking for + // the field and namespace allowing more extensibility for validators. + GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool) +} + +var _ FieldLevel = new(validate) + +// Field returns current field for validation +func (v *validate) Field() reflect.Value { + return v.flField +} + +// FieldName returns the field's name with the tag +// name taking precedence over the fields actual name. +func (v *validate) FieldName() string { + return v.cf.altName +} + +// GetTag returns the current validations tag name +func (v *validate) GetTag() string { + return v.ct.tag +} + +// StructFieldName returns the struct field's name +func (v *validate) StructFieldName() string { + return v.cf.name +} + +// Param returns param for validation against current field +func (v *validate) Param() string { + return v.ct.param +} + +// GetStructFieldOK returns Param returns param for validation against current field +// +// Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable. +func (v *validate) GetStructFieldOK() (reflect.Value, reflect.Kind, bool) { + current, kind, _, found := v.getStructFieldOKInternal(v.slflParent, v.ct.param) + return current, kind, found +} + +// GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for +// the field and namespace allowing more extensibility for validators. +// +// Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable. +func (v *validate) GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool) { + current, kind, _, found := v.GetStructFieldOKAdvanced2(val, namespace) + return current, kind, found +} + +// GetStructFieldOK2 returns Param returns param for validation against current field +func (v *validate) GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool) { + return v.getStructFieldOKInternal(v.slflParent, v.ct.param) +} + +// GetStructFieldOKAdvanced2 is the same as GetStructFieldOK except that it accepts the parent struct to start looking for +// the field and namespace allowing more extensibility for validators. +func (v *validate) GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool) { + return v.getStructFieldOKInternal(val, namespace) +} diff --git a/vendor/github.com/go-playground/validator/v10/logo.png b/vendor/github.com/go-playground/validator/v10/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..42ee9b18f0e43d6bee6c9a48ed8ae7d72eeb7c0d GIT binary patch literal 13442 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 UvPNJ*2Zq4prIn=`B}~Hp4~CE*8~^|S literal 0 HcmV?d00001 diff --git a/vendor/github.com/go-playground/validator/v10/options.go b/vendor/github.com/go-playground/validator/v10/options.go new file mode 100644 index 00000000..86a0db21 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/options.go @@ -0,0 +1,26 @@ +package validator + +// Option represents a configurations option to be applied to validator during initialization. +type Option func(*Validate) + +// WithRequiredStructEnabled enables required tag on non-pointer structs to be applied instead of ignored. +// +// This was made opt-in behaviour in order to maintain backward compatibility with the behaviour previous +// to being able to apply struct level validations on struct fields directly. +// +// It is recommended you enabled this as it will be the default behaviour in v11+ +func WithRequiredStructEnabled() Option { + return func(v *Validate) { + v.requiredStructEnabled = true + } +} + +// WithPrivateFieldValidation activates validation for unexported fields via the use of the `unsafe` package. +// +// By opting into this feature you are acknowledging that you are aware of the risks and accept any current or future +// consequences of using this feature. +func WithPrivateFieldValidation() Option { + return func(v *Validate) { + v.privateFieldValidation = true + } +} diff --git a/vendor/github.com/go-playground/validator/v10/postcode_regexes.go b/vendor/github.com/go-playground/validator/v10/postcode_regexes.go new file mode 100644 index 00000000..326b8f75 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/postcode_regexes.go @@ -0,0 +1,179 @@ +package validator + +import ( + "regexp" + "sync" +) + +var postCodePatternDict = map[string]string{ + "GB": `^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}$`, + "JE": `^JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`, + "GG": `^GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`, + "IM": `^IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`, + "US": `^\d{5}([ \-]\d{4})?$`, + "CA": `^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d$`, + "DE": `^\d{5}$`, + "JP": `^\d{3}-\d{4}$`, + "FR": `^\d{2}[ ]?\d{3}$`, + "AU": `^\d{4}$`, + "IT": `^\d{5}$`, + "CH": `^\d{4}$`, + "AT": `^\d{4}$`, + "ES": `^\d{5}$`, + "NL": `^\d{4}[ ]?[A-Z]{2}$`, + "BE": `^\d{4}$`, + "DK": `^\d{4}$`, + "SE": `^\d{3}[ ]?\d{2}$`, + "NO": `^\d{4}$`, + "BR": `^\d{5}[\-]?\d{3}$`, + "PT": `^\d{4}([\-]\d{3})?$`, + "FI": `^\d{5}$`, + "AX": `^22\d{3}$`, + "KR": `^\d{3}[\-]\d{3}$`, + "CN": `^\d{6}$`, + "TW": `^\d{3}(\d{2})?$`, + "SG": `^\d{6}$`, + "DZ": `^\d{5}$`, + "AD": `^AD\d{3}$`, + "AR": `^([A-HJ-NP-Z])?\d{4}([A-Z]{3})?$`, + "AM": `^(37)?\d{4}$`, + "AZ": `^\d{4}$`, + "BH": `^((1[0-2]|[2-9])\d{2})?$`, + "BD": `^\d{4}$`, + "BB": `^(BB\d{5})?$`, + "BY": `^\d{6}$`, + "BM": `^[A-Z]{2}[ ]?[A-Z0-9]{2}$`, + "BA": `^\d{5}$`, + "IO": `^BBND 1ZZ$`, + "BN": `^[A-Z]{2}[ ]?\d{4}$`, + "BG": `^\d{4}$`, + "KH": `^\d{5}$`, + "CV": `^\d{4}$`, + "CL": `^\d{7}$`, + "CR": `^\d{4,5}|\d{3}-\d{4}$`, + "HR": `^\d{5}$`, + "CY": `^\d{4}$`, + "CZ": `^\d{3}[ ]?\d{2}$`, + "DO": `^\d{5}$`, + "EC": `^([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?$`, + "EG": `^\d{5}$`, + "EE": `^\d{5}$`, + "FO": `^\d{3}$`, + "GE": `^\d{4}$`, + "GR": `^\d{3}[ ]?\d{2}$`, + "GL": `^39\d{2}$`, + "GT": `^\d{5}$`, + "HT": `^\d{4}$`, + "HN": `^(?:\d{5})?$`, + "HU": `^\d{4}$`, + "IS": `^\d{3}$`, + "IN": `^\d{6}$`, + "ID": `^\d{5}$`, + "IL": `^\d{5}$`, + "JO": `^\d{5}$`, + "KZ": `^\d{6}$`, + "KE": `^\d{5}$`, + "KW": `^\d{5}$`, + "LA": `^\d{5}$`, + "LV": `^\d{4}$`, + "LB": `^(\d{4}([ ]?\d{4})?)?$`, + "LI": `^(948[5-9])|(949[0-7])$`, + "LT": `^\d{5}$`, + "LU": `^\d{4}$`, + "MK": `^\d{4}$`, + "MY": `^\d{5}$`, + "MV": `^\d{5}$`, + "MT": `^[A-Z]{3}[ ]?\d{2,4}$`, + "MU": `^(\d{3}[A-Z]{2}\d{3})?$`, + "MX": `^\d{5}$`, + "MD": `^\d{4}$`, + "MC": `^980\d{2}$`, + "MA": `^\d{5}$`, + "NP": `^\d{5}$`, + "NZ": `^\d{4}$`, + "NI": `^((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?$`, + "NG": `^(\d{6})?$`, + "OM": `^(PC )?\d{3}$`, + "PK": `^\d{5}$`, + "PY": `^\d{4}$`, + "PH": `^\d{4}$`, + "PL": `^\d{2}-\d{3}$`, + "PR": `^00[679]\d{2}([ \-]\d{4})?$`, + "RO": `^\d{6}$`, + "RU": `^\d{6}$`, + "SM": `^4789\d$`, + "SA": `^\d{5}$`, + "SN": `^\d{5}$`, + "SK": `^\d{3}[ ]?\d{2}$`, + "SI": `^\d{4}$`, + "ZA": `^\d{4}$`, + "LK": `^\d{5}$`, + "TJ": `^\d{6}$`, + "TH": `^\d{5}$`, + "TN": `^\d{4}$`, + "TR": `^\d{5}$`, + "TM": `^\d{6}$`, + "UA": `^\d{5}$`, + "UY": `^\d{5}$`, + "UZ": `^\d{6}$`, + "VA": `^00120$`, + "VE": `^\d{4}$`, + "ZM": `^\d{5}$`, + "AS": `^96799$`, + "CC": `^6799$`, + "CK": `^\d{4}$`, + "RS": `^\d{6}$`, + "ME": `^8\d{4}$`, + "CS": `^\d{5}$`, + "YU": `^\d{5}$`, + "CX": `^6798$`, + "ET": `^\d{4}$`, + "FK": `^FIQQ 1ZZ$`, + "NF": `^2899$`, + "FM": `^(9694[1-4])([ \-]\d{4})?$`, + "GF": `^9[78]3\d{2}$`, + "GN": `^\d{3}$`, + "GP": `^9[78][01]\d{2}$`, + "GS": `^SIQQ 1ZZ$`, + "GU": `^969[123]\d([ \-]\d{4})?$`, + "GW": `^\d{4}$`, + "HM": `^\d{4}$`, + "IQ": `^\d{5}$`, + "KG": `^\d{6}$`, + "LR": `^\d{4}$`, + "LS": `^\d{3}$`, + "MG": `^\d{3}$`, + "MH": `^969[67]\d([ \-]\d{4})?$`, + "MN": `^\d{6}$`, + "MP": `^9695[012]([ \-]\d{4})?$`, + "MQ": `^9[78]2\d{2}$`, + "NC": `^988\d{2}$`, + "NE": `^\d{4}$`, + "VI": `^008(([0-4]\d)|(5[01]))([ \-]\d{4})?$`, + "VN": `^[0-9]{1,6}$`, + "PF": `^987\d{2}$`, + "PG": `^\d{3}$`, + "PM": `^9[78]5\d{2}$`, + "PN": `^PCRN 1ZZ$`, + "PW": `^96940$`, + "RE": `^9[78]4\d{2}$`, + "SH": `^(ASCN|STHL) 1ZZ$`, + "SJ": `^\d{4}$`, + "SO": `^\d{5}$`, + "SZ": `^[HLMS]\d{3}$`, + "TC": `^TKCA 1ZZ$`, + "WF": `^986\d{2}$`, + "XK": `^\d{5}$`, + "YT": `^976\d{2}$`, +} + +var ( + postcodeRegexInit sync.Once + postCodeRegexDict = map[string]*regexp.Regexp{} +) + +func initPostcodes() { + for countryCode, pattern := range postCodePatternDict { + postCodeRegexDict[countryCode] = regexp.MustCompile(pattern) + } +} diff --git a/vendor/github.com/go-playground/validator/v10/regexes.go b/vendor/github.com/go-playground/validator/v10/regexes.go new file mode 100644 index 00000000..871cf7df --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/regexes.go @@ -0,0 +1,163 @@ +package validator + +import ( + "regexp" + "sync" +) + +const ( + alphaRegexString = "^[a-zA-Z]+$" + alphaNumericRegexString = "^[a-zA-Z0-9]+$" + alphaUnicodeRegexString = "^[\\p{L}]+$" + alphaUnicodeNumericRegexString = "^[\\p{L}\\p{N}]+$" + numericRegexString = "^[-+]?[0-9]+(?:\\.[0-9]+)?$" + numberRegexString = "^[0-9]+$" + hexadecimalRegexString = "^(0[xX])?[0-9a-fA-F]+$" + hexColorRegexString = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$" + rgbRegexString = "^rgb\\(\\s*(?:(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])|(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%)\\s*\\)$" + rgbaRegexString = "^rgba\\(\\s*(?:(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])|(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$" + hslRegexString = "^hsl\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*\\)$" + hslaRegexString = "^hsla\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$" + emailRegexString = "^(?:(?:(?:(?:[a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(?:\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|(?:(?:\\x22)(?:(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(?:\\x20|\\x09)+)?(?:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(\\x20|\\x09)+)?(?:\\x22))))@(?:(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" + e164RegexString = "^\\+[1-9]?[0-9]{7,14}$" + base32RegexString = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=|[A-Z2-7]{8})$" + base64RegexString = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" + base64URLRegexString = "^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2}==|[A-Za-z0-9-_]{3}=|[A-Za-z0-9-_]{4})$" + 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}$" + uUIDRegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + uUID3RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-3[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + uUID4RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$" + uUID5RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-5[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$" + uUIDRFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + uLIDRegexString = "^(?i)[A-HJKMNP-TV-Z0-9]{26}$" + md4RegexString = "^[0-9a-f]{32}$" + md5RegexString = "^[0-9a-f]{32}$" + sha256RegexString = "^[0-9a-f]{64}$" + sha384RegexString = "^[0-9a-f]{96}$" + sha512RegexString = "^[0-9a-f]{128}$" + ripemd128RegexString = "^[0-9a-f]{32}$" + ripemd160RegexString = "^[0-9a-f]{40}$" + tiger128RegexString = "^[0-9a-f]{32}$" + tiger160RegexString = "^[0-9a-f]{40}$" + tiger192RegexString = "^[0-9a-f]{48}$" + aSCIIRegexString = "^[\x00-\x7F]*$" + printableASCIIRegexString = "^[\x20-\x7E]*$" + multibyteRegexString = "[^\x00-\x7F]" + dataURIRegexString = `^data:((?:\w+\/(?:([^;]|;[^;]).)+)?)` + latitudeRegexString = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" + longitudeRegexString = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" + sSNRegexString = `^[0-9]{3}[ -]?(0[1-9]|[1-9][0-9])[ -]?([1-9][0-9]{3}|[0-9][1-9][0-9]{2}|[0-9]{2}[1-9][0-9]|[0-9]{3}[1-9])$` + hostnameRegexStringRFC952 = `^[a-zA-Z]([a-zA-Z0-9\-]+[\.]?)*[a-zA-Z0-9]$` // https://tools.ietf.org/html/rfc952 + hostnameRegexStringRFC1123 = `^([a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62}){1}(\.[a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})*?$` // accepts hostname starting with a digit https://tools.ietf.org/html/rfc1123 + fqdnRegexStringRFC1123 = `^([a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})(\.[a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})*?(\.[a-zA-Z]{1}[a-zA-Z0-9]{0,62})\.?$` // same as hostnameRegexStringRFC1123 but must contain a non numerical TLD (possibly ending with '.') + btcAddressRegexString = `^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$` // bitcoin address + btcAddressUpperRegexStringBech32 = `^BC1[02-9AC-HJ-NP-Z]{7,76}$` // bitcoin bech32 address https://en.bitcoin.it/wiki/Bech32 + btcAddressLowerRegexStringBech32 = `^bc1[02-9ac-hj-np-z]{7,76}$` // bitcoin bech32 address https://en.bitcoin.it/wiki/Bech32 + ethAddressRegexString = `^0x[0-9a-fA-F]{40}$` + ethAddressUpperRegexString = `^0x[0-9A-F]{40}$` + ethAddressLowerRegexString = `^0x[0-9a-f]{40}$` + uRLEncodedRegexString = `^(?:[^%]|%[0-9A-Fa-f]{2})*$` + hTMLEncodedRegexString = `&#[x]?([0-9a-fA-F]{2})|(>)|(<)|(")|(&)+[;]?` + hTMLRegexString = `<[/]?([a-zA-Z]+).*?>` + jWTRegexString = "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$" + splitParamsRegexString = `'[^']*'|\S+` + bicRegexString = `^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$` + semverRegexString = `^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$` // numbered capture groups https://semver.org/ + dnsRegexStringRFC1035Label = "^[a-z]([-a-z0-9]*[a-z0-9]){0,62}$" + cveRegexString = `^CVE-(1999|2\d{3})-(0[^0]\d{2}|0\d[^0]\d{1}|0\d{2}[^0]|[1-9]{1}\d{3,})$` // CVE Format Id https://cve.mitre.org/cve/identifiers/syntaxchange.html + mongodbIdRegexString = "^[a-f\\d]{24}$" + mongodbConnStringRegexString = "^mongodb(\\+srv)?:\\/\\/(([a-zA-Z\\d]+):([a-zA-Z\\d$:\\/?#\\[\\]@]+)@)?(([a-z\\d.-]+)(:[\\d]+)?)((,(([a-z\\d.-]+)(:(\\d+))?))*)?(\\/[a-zA-Z-_]{1,64})?(\\?(([a-zA-Z]+)=([a-zA-Z\\d]+))(&(([a-zA-Z\\d]+)=([a-zA-Z\\d]+))?)*)?$" + cronRegexString = `(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)|((((\d+,)+\d+|((\*|\d+)(\/|-)\d+)|\d+|\*) ?){5,7})` + spicedbIDRegexString = `^(([a-zA-Z0-9/_|\-=+]{1,})|\*)$` + spicedbPermissionRegexString = "^([a-z][a-z0-9_]{1,62}[a-z0-9])?$" + spicedbTypeRegexString = "^([a-z][a-z0-9_]{1,61}[a-z0-9]/)?[a-z][a-z0-9_]{1,62}[a-z0-9]$" +) + +func lazyRegexCompile(str string) func() *regexp.Regexp { + var regex *regexp.Regexp + var once sync.Once + return func() *regexp.Regexp { + once.Do(func() { + regex = regexp.MustCompile(str) + }) + return regex + } +} + +var ( + alphaRegex = lazyRegexCompile(alphaRegexString) + alphaNumericRegex = lazyRegexCompile(alphaNumericRegexString) + alphaUnicodeRegex = lazyRegexCompile(alphaUnicodeRegexString) + alphaUnicodeNumericRegex = lazyRegexCompile(alphaUnicodeNumericRegexString) + numericRegex = lazyRegexCompile(numericRegexString) + numberRegex = lazyRegexCompile(numberRegexString) + hexadecimalRegex = lazyRegexCompile(hexadecimalRegexString) + hexColorRegex = lazyRegexCompile(hexColorRegexString) + rgbRegex = lazyRegexCompile(rgbRegexString) + rgbaRegex = lazyRegexCompile(rgbaRegexString) + hslRegex = lazyRegexCompile(hslRegexString) + hslaRegex = lazyRegexCompile(hslaRegexString) + e164Regex = lazyRegexCompile(e164RegexString) + emailRegex = lazyRegexCompile(emailRegexString) + base32Regex = lazyRegexCompile(base32RegexString) + base64Regex = lazyRegexCompile(base64RegexString) + base64URLRegex = lazyRegexCompile(base64URLRegexString) + base64RawURLRegex = lazyRegexCompile(base64RawURLRegexString) + iSBN10Regex = lazyRegexCompile(iSBN10RegexString) + iSBN13Regex = lazyRegexCompile(iSBN13RegexString) + iSSNRegex = lazyRegexCompile(iSSNRegexString) + uUID3Regex = lazyRegexCompile(uUID3RegexString) + uUID4Regex = lazyRegexCompile(uUID4RegexString) + uUID5Regex = lazyRegexCompile(uUID5RegexString) + uUIDRegex = lazyRegexCompile(uUIDRegexString) + uUID3RFC4122Regex = lazyRegexCompile(uUID3RFC4122RegexString) + uUID4RFC4122Regex = lazyRegexCompile(uUID4RFC4122RegexString) + uUID5RFC4122Regex = lazyRegexCompile(uUID5RFC4122RegexString) + uUIDRFC4122Regex = lazyRegexCompile(uUIDRFC4122RegexString) + uLIDRegex = lazyRegexCompile(uLIDRegexString) + md4Regex = lazyRegexCompile(md4RegexString) + md5Regex = lazyRegexCompile(md5RegexString) + sha256Regex = lazyRegexCompile(sha256RegexString) + sha384Regex = lazyRegexCompile(sha384RegexString) + sha512Regex = lazyRegexCompile(sha512RegexString) + ripemd128Regex = lazyRegexCompile(ripemd128RegexString) + ripemd160Regex = lazyRegexCompile(ripemd160RegexString) + tiger128Regex = lazyRegexCompile(tiger128RegexString) + tiger160Regex = lazyRegexCompile(tiger160RegexString) + tiger192Regex = lazyRegexCompile(tiger192RegexString) + aSCIIRegex = lazyRegexCompile(aSCIIRegexString) + printableASCIIRegex = lazyRegexCompile(printableASCIIRegexString) + multibyteRegex = lazyRegexCompile(multibyteRegexString) + dataURIRegex = lazyRegexCompile(dataURIRegexString) + latitudeRegex = lazyRegexCompile(latitudeRegexString) + longitudeRegex = lazyRegexCompile(longitudeRegexString) + sSNRegex = lazyRegexCompile(sSNRegexString) + hostnameRegexRFC952 = lazyRegexCompile(hostnameRegexStringRFC952) + hostnameRegexRFC1123 = lazyRegexCompile(hostnameRegexStringRFC1123) + fqdnRegexRFC1123 = lazyRegexCompile(fqdnRegexStringRFC1123) + btcAddressRegex = lazyRegexCompile(btcAddressRegexString) + btcUpperAddressRegexBech32 = lazyRegexCompile(btcAddressUpperRegexStringBech32) + btcLowerAddressRegexBech32 = lazyRegexCompile(btcAddressLowerRegexStringBech32) + ethAddressRegex = lazyRegexCompile(ethAddressRegexString) + uRLEncodedRegex = lazyRegexCompile(uRLEncodedRegexString) + hTMLEncodedRegex = lazyRegexCompile(hTMLEncodedRegexString) + hTMLRegex = lazyRegexCompile(hTMLRegexString) + jWTRegex = lazyRegexCompile(jWTRegexString) + splitParamsRegex = lazyRegexCompile(splitParamsRegexString) + bicRegex = lazyRegexCompile(bicRegexString) + semverRegex = lazyRegexCompile(semverRegexString) + dnsRegexRFC1035Label = lazyRegexCompile(dnsRegexStringRFC1035Label) + cveRegex = lazyRegexCompile(cveRegexString) + mongodbIdRegex = lazyRegexCompile(mongodbIdRegexString) + mongodbConnectionRegex = lazyRegexCompile(mongodbConnStringRegexString) + cronRegex = lazyRegexCompile(cronRegexString) + spicedbIDRegex = lazyRegexCompile(spicedbIDRegexString) + spicedbPermissionRegex = lazyRegexCompile(spicedbPermissionRegexString) + spicedbTypeRegex = lazyRegexCompile(spicedbTypeRegexString) +) diff --git a/vendor/github.com/go-playground/validator/v10/struct_level.go b/vendor/github.com/go-playground/validator/v10/struct_level.go new file mode 100644 index 00000000..271328f7 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/struct_level.go @@ -0,0 +1,175 @@ +package validator + +import ( + "context" + "reflect" +) + +// StructLevelFunc accepts all values needed for struct level validation +type StructLevelFunc func(sl StructLevel) + +// StructLevelFuncCtx accepts all values needed for struct level validation +// but also allows passing of contextual validation information via context.Context. +type StructLevelFuncCtx func(ctx context.Context, sl StructLevel) + +// wrapStructLevelFunc wraps normal StructLevelFunc makes it compatible with StructLevelFuncCtx +func wrapStructLevelFunc(fn StructLevelFunc) StructLevelFuncCtx { + return func(ctx context.Context, sl StructLevel) { + fn(sl) + } +} + +// StructLevel contains all the information and helper functions +// to validate a struct +type StructLevel interface { + + // Validator returns the main validation object, in case one wants to call validations internally. + // this is so you don't have to use anonymous functions to get access to the validate + // instance. + Validator() *Validate + + // Top returns the top level struct, if any + Top() reflect.Value + + // Parent returns the current fields parent struct, if any + Parent() reflect.Value + + // Current returns the current struct. + Current() reflect.Value + + // ExtractType gets the actual underlying type of field value. + // It will dive into pointers, customTypes and return you the + // underlying value and its kind. + ExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool) + + // ReportError reports an error just by passing the field and tag information + // + // NOTES: + // + // fieldName and altName get appended to the existing namespace that + // validator is on. e.g. pass 'FirstName' or 'Names[0]' depending + // on the nesting + // + // tag can be an existing validation tag or just something you make up + // and process on the flip side it's up to you. + ReportError(field interface{}, fieldName, structFieldName string, tag, param string) + + // ReportValidationErrors reports an error just by passing ValidationErrors + // + // NOTES: + // + // relativeNamespace and relativeActualNamespace get appended to the + // existing namespace that validator is on. + // e.g. pass 'User.FirstName' or 'Users[0].FirstName' depending + // on the nesting. most of the time they will be blank, unless you validate + // at a level lower the current field depth + ReportValidationErrors(relativeNamespace, relativeActualNamespace string, errs ValidationErrors) +} + +var _ StructLevel = new(validate) + +// Top returns the top level struct +// +// NOTE: this can be the same as the current struct being validated +// if not is a nested struct. +// +// this is only called when within Struct and Field Level validation and +// should not be relied upon for an accurate value otherwise. +func (v *validate) Top() reflect.Value { + return v.top +} + +// Parent returns the current structs parent +// +// NOTE: this can be the same as the current struct being validated +// if not is a nested struct. +// +// this is only called when within Struct and Field Level validation and +// should not be relied upon for an accurate value otherwise. +func (v *validate) Parent() reflect.Value { + return v.slflParent +} + +// Current returns the current struct. +func (v *validate) Current() reflect.Value { + return v.slCurrent +} + +// Validator returns the main validation object, in case one want to call validations internally. +func (v *validate) Validator() *Validate { + return v.v +} + +// ExtractType gets the actual underlying type of field value. +func (v *validate) ExtractType(field reflect.Value) (reflect.Value, reflect.Kind, bool) { + return v.extractTypeInternal(field, false) +} + +// ReportError reports an error just by passing the field and tag information +func (v *validate) ReportError(field interface{}, fieldName, structFieldName, tag, param string) { + + fv, kind, _ := v.extractTypeInternal(reflect.ValueOf(field), false) + + if len(structFieldName) == 0 { + structFieldName = fieldName + } + + v.str1 = string(append(v.ns, fieldName...)) + + if v.v.hasTagNameFunc || fieldName != structFieldName { + v.str2 = string(append(v.actualNs, structFieldName...)) + } else { + v.str2 = v.str1 + } + + if kind == reflect.Invalid { + + v.errs = append(v.errs, + &fieldError{ + v: v.v, + tag: tag, + actualTag: tag, + ns: v.str1, + structNs: v.str2, + fieldLen: uint8(len(fieldName)), + structfieldLen: uint8(len(structFieldName)), + param: param, + kind: kind, + }, + ) + return + } + + v.errs = append(v.errs, + &fieldError{ + v: v.v, + tag: tag, + actualTag: tag, + ns: v.str1, + structNs: v.str2, + fieldLen: uint8(len(fieldName)), + structfieldLen: uint8(len(structFieldName)), + value: fv.Interface(), + param: param, + kind: kind, + typ: fv.Type(), + }, + ) +} + +// ReportValidationErrors reports ValidationErrors obtained from running validations within the Struct Level validation. +// +// NOTE: this function prepends the current namespace to the relative ones. +func (v *validate) ReportValidationErrors(relativeNamespace, relativeStructNamespace string, errs ValidationErrors) { + + var err *fieldError + + for i := 0; i < len(errs); i++ { + + err = errs[i].(*fieldError) + err.ns = string(append(append(v.ns, relativeNamespace...), err.ns...)) + err.structNs = string(append(append(v.actualNs, relativeStructNamespace...), err.structNs...)) + + v.errs = append(v.errs, err) + } +} diff --git a/vendor/github.com/go-playground/validator/v10/translations.go b/vendor/github.com/go-playground/validator/v10/translations.go new file mode 100644 index 00000000..4d9d75c1 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/translations.go @@ -0,0 +1,11 @@ +package validator + +import ut "github.com/go-playground/universal-translator" + +// TranslationFunc is the function type used to register or override +// custom translations +type TranslationFunc func(ut ut.Translator, fe FieldError) string + +// RegisterTranslationsFunc allows for registering of translations +// for a 'ut.Translator' for use within the 'TranslationFunc' +type RegisterTranslationsFunc func(ut ut.Translator) error diff --git a/vendor/github.com/go-playground/validator/v10/util.go b/vendor/github.com/go-playground/validator/v10/util.go new file mode 100644 index 00000000..9285223a --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/util.go @@ -0,0 +1,312 @@ +package validator + +import ( + "fmt" + "reflect" + "regexp" + "strconv" + "strings" + "time" +) + +// extractTypeInternal gets the actual underlying type of field value. +// It will dive into pointers, customTypes and return you the +// underlying value and it's kind. +func (v *validate) extractTypeInternal(current reflect.Value, nullable bool) (reflect.Value, reflect.Kind, bool) { + +BEGIN: + switch current.Kind() { + case reflect.Ptr: + + nullable = true + + if current.IsNil() { + return current, reflect.Ptr, nullable + } + + current = current.Elem() + goto BEGIN + + case reflect.Interface: + + nullable = true + + if current.IsNil() { + return current, reflect.Interface, nullable + } + + current = current.Elem() + goto BEGIN + + case reflect.Invalid: + return current, reflect.Invalid, nullable + + default: + + if v.v.hasCustomFuncs { + + if fn, ok := v.v.customFuncs[current.Type()]; ok { + current = reflect.ValueOf(fn(current)) + goto BEGIN + } + } + + return current, current.Kind(), nullable + } +} + +// getStructFieldOKInternal traverses a struct to retrieve a specific field denoted by the provided namespace and +// returns the field, field kind and whether is was successful in retrieving the field at all. +// +// NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field +// could not be retrieved because it didn't exist. +func (v *validate) getStructFieldOKInternal(val reflect.Value, namespace string) (current reflect.Value, kind reflect.Kind, nullable bool, found bool) { + +BEGIN: + current, kind, nullable = v.ExtractType(val) + if kind == reflect.Invalid { + return + } + + if namespace == "" { + found = true + return + } + + switch kind { + + case reflect.Ptr, reflect.Interface: + return + + case reflect.Struct: + + typ := current.Type() + fld := namespace + var ns string + + if !typ.ConvertibleTo(timeType) { + + idx := strings.Index(namespace, namespaceSeparator) + + if idx != -1 { + fld = namespace[:idx] + ns = namespace[idx+1:] + } else { + ns = "" + } + + bracketIdx := strings.Index(fld, leftBracket) + if bracketIdx != -1 { + fld = fld[:bracketIdx] + + ns = namespace[bracketIdx:] + } + + val = current.FieldByName(fld) + namespace = ns + goto BEGIN + } + + case reflect.Array, reflect.Slice: + idx := strings.Index(namespace, leftBracket) + idx2 := strings.Index(namespace, rightBracket) + + arrIdx, _ := strconv.Atoi(namespace[idx+1 : idx2]) + + if arrIdx >= current.Len() { + return + } + + startIdx := idx2 + 1 + + if startIdx < len(namespace) { + if namespace[startIdx:startIdx+1] == namespaceSeparator { + startIdx++ + } + } + + val = current.Index(arrIdx) + namespace = namespace[startIdx:] + goto BEGIN + + case reflect.Map: + idx := strings.Index(namespace, leftBracket) + 1 + idx2 := strings.Index(namespace, rightBracket) + + endIdx := idx2 + + if endIdx+1 < len(namespace) { + if namespace[endIdx+1:endIdx+2] == namespaceSeparator { + endIdx++ + } + } + + key := namespace[idx:idx2] + + switch current.Type().Key().Kind() { + case reflect.Int: + i, _ := strconv.Atoi(key) + val = current.MapIndex(reflect.ValueOf(i)) + namespace = namespace[endIdx+1:] + + case reflect.Int8: + i, _ := strconv.ParseInt(key, 10, 8) + val = current.MapIndex(reflect.ValueOf(int8(i))) + namespace = namespace[endIdx+1:] + + case reflect.Int16: + i, _ := strconv.ParseInt(key, 10, 16) + val = current.MapIndex(reflect.ValueOf(int16(i))) + namespace = namespace[endIdx+1:] + + case reflect.Int32: + i, _ := strconv.ParseInt(key, 10, 32) + val = current.MapIndex(reflect.ValueOf(int32(i))) + namespace = namespace[endIdx+1:] + + case reflect.Int64: + i, _ := strconv.ParseInt(key, 10, 64) + val = current.MapIndex(reflect.ValueOf(i)) + namespace = namespace[endIdx+1:] + + case reflect.Uint: + i, _ := strconv.ParseUint(key, 10, 0) + val = current.MapIndex(reflect.ValueOf(uint(i))) + namespace = namespace[endIdx+1:] + + case reflect.Uint8: + i, _ := strconv.ParseUint(key, 10, 8) + val = current.MapIndex(reflect.ValueOf(uint8(i))) + namespace = namespace[endIdx+1:] + + case reflect.Uint16: + i, _ := strconv.ParseUint(key, 10, 16) + val = current.MapIndex(reflect.ValueOf(uint16(i))) + namespace = namespace[endIdx+1:] + + case reflect.Uint32: + i, _ := strconv.ParseUint(key, 10, 32) + val = current.MapIndex(reflect.ValueOf(uint32(i))) + namespace = namespace[endIdx+1:] + + case reflect.Uint64: + i, _ := strconv.ParseUint(key, 10, 64) + val = current.MapIndex(reflect.ValueOf(i)) + namespace = namespace[endIdx+1:] + + case reflect.Float32: + f, _ := strconv.ParseFloat(key, 32) + val = current.MapIndex(reflect.ValueOf(float32(f))) + namespace = namespace[endIdx+1:] + + case reflect.Float64: + f, _ := strconv.ParseFloat(key, 64) + val = current.MapIndex(reflect.ValueOf(f)) + namespace = namespace[endIdx+1:] + + case reflect.Bool: + b, _ := strconv.ParseBool(key) + val = current.MapIndex(reflect.ValueOf(b)) + namespace = namespace[endIdx+1:] + + // reflect.Type = string + default: + val = current.MapIndex(reflect.ValueOf(key)) + namespace = namespace[endIdx+1:] + } + + goto BEGIN + } + + // if got here there was more namespace, cannot go any deeper + panic("Invalid field namespace") +} + +// asInt returns the parameter as a int64 +// or panics if it can't convert +func asInt(param string) int64 { + i, err := strconv.ParseInt(param, 0, 64) + panicIf(err) + + return i +} + +// asIntFromTimeDuration parses param as time.Duration and returns it as int64 +// or panics on error. +func asIntFromTimeDuration(param string) int64 { + d, err := time.ParseDuration(param) + if err != nil { + // attempt parsing as an integer assuming nanosecond precision + return asInt(param) + } + return int64(d) +} + +// asIntFromType calls the proper function to parse param as int64, +// given a field's Type t. +func asIntFromType(t reflect.Type, param string) int64 { + switch t { + case timeDurationType: + return asIntFromTimeDuration(param) + default: + return asInt(param) + } +} + +// asUint returns the parameter as a uint64 +// or panics if it can't convert +func asUint(param string) uint64 { + + i, err := strconv.ParseUint(param, 0, 64) + panicIf(err) + + return i +} + +// asFloat64 returns the parameter as a float64 +// or panics if it can't convert +func asFloat64(param string) float64 { + i, err := strconv.ParseFloat(param, 64) + panicIf(err) + return i +} + +// asFloat32 returns the parameter as a float32 +// or panics if it can't convert +func asFloat32(param string) float64 { + i, err := strconv.ParseFloat(param, 32) + panicIf(err) + return i +} + +// asBool returns the parameter as a bool +// or panics if it can't convert +func asBool(param string) bool { + + i, err := strconv.ParseBool(param) + panicIf(err) + + return i +} + +func panicIf(err error) { + if err != nil { + 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(regexFn func() *regexp.Regexp, fl FieldLevel) bool { + regex := regexFn() + 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 new file mode 100644 index 00000000..901e7b50 --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/validator.go @@ -0,0 +1,510 @@ +package validator + +import ( + "context" + "fmt" + "reflect" + "strconv" + "unsafe" +) + +// per validate construct +type validate struct { + v *Validate + top reflect.Value + ns []byte + actualNs []byte + errs ValidationErrors + includeExclude map[string]struct{} // reset only if StructPartial or StructExcept are called, no need otherwise + ffn FilterFunc + slflParent reflect.Value // StructLevel & FieldLevel + slCurrent reflect.Value // StructLevel & FieldLevel + flField reflect.Value // StructLevel & FieldLevel + cf *cField // StructLevel & FieldLevel + ct *cTag // StructLevel & FieldLevel + misc []byte // misc reusable + str1 string // misc reusable + str2 string // misc reusable + fldIsPointer bool // StructLevel & FieldLevel + isPartial bool + hasExcludes bool +} + +// parent and current will be the same the first run of validateStruct +func (v *validate) validateStruct(ctx context.Context, parent reflect.Value, current reflect.Value, typ reflect.Type, ns []byte, structNs []byte, ct *cTag) { + + cs, ok := v.v.structCache.Get(typ) + if !ok { + cs = v.v.extractStructCache(current, typ.Name()) + } + + if len(ns) == 0 && len(cs.name) != 0 { + + ns = append(ns, cs.name...) + ns = append(ns, '.') + + structNs = append(structNs, cs.name...) + structNs = append(structNs, '.') + } + + // ct is nil on top level struct, and structs as fields that have no tag info + // so if nil or if not nil and the structonly tag isn't present + if ct == nil || ct.typeof != typeStructOnly { + + var f *cField + + for i := 0; i < len(cs.fields); i++ { + + f = cs.fields[i] + + if v.isPartial { + + if v.ffn != nil { + // used with StructFiltered + if v.ffn(append(structNs, f.name...)) { + continue + } + + } else { + // used with StructPartial & StructExcept + _, ok = v.includeExclude[string(append(structNs, f.name...))] + + if (ok && v.hasExcludes) || (!ok && !v.hasExcludes) { + continue + } + } + } + + v.traverseField(ctx, current, current.Field(f.idx), ns, structNs, f, f.cTags) + } + } + + // check if any struct level validations, after all field validations already checked. + // first iteration will have no info about nostructlevel tag, and is checked prior to + // calling the next iteration of validateStruct called from traverseField. + if cs.fn != nil { + + v.slflParent = parent + v.slCurrent = current + v.ns = ns + v.actualNs = structNs + + cs.fn(ctx, v) + } +} + +// traverseField validates any field, be it a struct or single field, ensures it's validity and passes it along to be validated via it's tag options +func (v *validate) traverseField(ctx context.Context, parent reflect.Value, current reflect.Value, ns []byte, structNs []byte, cf *cField, ct *cTag) { + var typ reflect.Type + var kind reflect.Kind + + current, kind, v.fldIsPointer = v.extractTypeInternal(current, false) + + var isNestedStruct bool + + switch kind { + case reflect.Ptr, reflect.Interface, reflect.Invalid: + + if ct == nil { + return + } + + if ct.typeof == typeOmitEmpty || ct.typeof == typeIsDefault { + 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...)) + if v.v.hasTagNameFunc { + v.str2 = string(append(structNs, cf.name...)) + } else { + v.str2 = v.str1 + } + v.errs = append(v.errs, + &fieldError{ + v: v.v, + tag: ct.aliasTag, + actualTag: ct.tag, + ns: v.str1, + structNs: v.str2, + fieldLen: uint8(len(cf.altName)), + structfieldLen: uint8(len(cf.name)), + param: ct.param, + kind: kind, + }, + ) + return + } + + v.str1 = string(append(ns, cf.altName...)) + if v.v.hasTagNameFunc { + v.str2 = string(append(structNs, cf.name...)) + } else { + v.str2 = v.str1 + } + if !ct.runValidationWhenNil { + v.errs = append(v.errs, + &fieldError{ + v: v.v, + tag: ct.aliasTag, + actualTag: ct.tag, + ns: v.str1, + structNs: v.str2, + fieldLen: uint8(len(cf.altName)), + structfieldLen: uint8(len(cf.name)), + value: getValue(current), + param: ct.param, + kind: kind, + typ: current.Type(), + }, + ) + return + } + } + + if kind == reflect.Invalid { + return + } + + case reflect.Struct: + isNestedStruct = !current.Type().ConvertibleTo(timeType) + // For backward compatibility before struct level validation tags were supported + // as there were a number of projects relying on `required` not failing on non-pointer + // 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 isNestedStruct && !v.v.requiredStructEnabled && ct != nil && ct.tag == requiredTag { + ct = ct.next + } + } + + typ = current.Type() + +OUTER: + for { + if ct == nil || !ct.hasTag || (isNestedStruct && len(cf.name) == 0) { + // isNestedStruct check here + if isNestedStruct { + // if len == 0 then validating using 'Var' or 'VarWithValue' + // Var - doesn't make much sense to do it that way, should call 'Struct', but no harm... + // VarWithField - this allows for validating against each field within the struct against a specific value + // pretty handy in certain situations + if len(cf.name) > 0 { + ns = append(append(ns, cf.altName...), '.') + structNs = append(append(structNs, cf.name...), '.') + } + + v.validateStruct(ctx, parent, current, typ, ns, structNs, ct) + } + return + } + + switch ct.typeof { + case typeNoStructLevel: + return + + case typeStructOnly: + if isNestedStruct { + // if len == 0 then validating using 'Var' or 'VarWithValue' + // Var - doesn't make much sense to do it that way, should call 'Struct', but no harm... + // VarWithField - this allows for validating against each field within the struct against a specific value + // pretty handy in certain situations + if len(cf.name) > 0 { + ns = append(append(ns, cf.altName...), '.') + structNs = append(append(structNs, cf.name...), '.') + } + + v.validateStruct(ctx, parent, current, typ, ns, structNs, ct) + } + return + + case typeOmitEmpty: + + // set Field Level fields + v.slflParent = parent + v.flField = current + v.cf = cf + v.ct = ct + + if !hasValue(v) { + return + } + + 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 + + case typeDive: + + ct = ct.next + + // traverse slice or map here + // or panic ;) + switch kind { + case reflect.Slice, reflect.Array: + + var i64 int64 + reusableCF := &cField{} + + for i := 0; i < current.Len(); i++ { + + i64 = int64(i) + + v.misc = append(v.misc[0:0], cf.name...) + v.misc = append(v.misc, '[') + v.misc = strconv.AppendInt(v.misc, i64, 10) + v.misc = append(v.misc, ']') + + reusableCF.name = string(v.misc) + + if cf.namesEqual { + reusableCF.altName = reusableCF.name + } else { + + v.misc = append(v.misc[0:0], cf.altName...) + v.misc = append(v.misc, '[') + v.misc = strconv.AppendInt(v.misc, i64, 10) + v.misc = append(v.misc, ']') + + reusableCF.altName = string(v.misc) + } + v.traverseField(ctx, parent, current.Index(i), ns, structNs, reusableCF, ct) + } + + case reflect.Map: + + var pv string + reusableCF := &cField{} + + for _, key := range current.MapKeys() { + + pv = fmt.Sprintf("%v", key.Interface()) + + v.misc = append(v.misc[0:0], cf.name...) + v.misc = append(v.misc, '[') + v.misc = append(v.misc, pv...) + v.misc = append(v.misc, ']') + + reusableCF.name = string(v.misc) + + if cf.namesEqual { + reusableCF.altName = reusableCF.name + } else { + v.misc = append(v.misc[0:0], cf.altName...) + v.misc = append(v.misc, '[') + v.misc = append(v.misc, pv...) + v.misc = append(v.misc, ']') + + reusableCF.altName = string(v.misc) + } + + if ct != nil && ct.typeof == typeKeys && ct.keys != nil { + v.traverseField(ctx, parent, key, ns, structNs, reusableCF, ct.keys) + // can be nil when just keys being validated + if ct.next != nil { + v.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct.next) + } + } else { + v.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct) + } + } + + default: + // throw error, if not a slice or map then should not have gotten here + // bad dive tag + panic("dive error! can't dive on a non slice or map") + } + + return + + case typeOr: + + v.misc = v.misc[0:0] + + for { + + // set Field Level fields + v.slflParent = parent + v.flField = current + v.cf = cf + v.ct = ct + + if ct.fn(ctx, v) { + if ct.isBlockEnd { + ct = ct.next + continue OUTER + } + + // drain rest of the 'or' values, then continue or leave + for { + + ct = ct.next + + if ct == nil { + continue OUTER + } + + if ct.typeof != typeOr { + continue OUTER + } + + if ct.isBlockEnd { + ct = ct.next + continue OUTER + } + } + } + + v.misc = append(v.misc, '|') + v.misc = append(v.misc, ct.tag...) + + if ct.hasParam { + v.misc = append(v.misc, '=') + v.misc = append(v.misc, ct.param...) + } + + if ct.isBlockEnd || ct.next == nil { + // if we get here, no valid 'or' value and no more tags + v.str1 = string(append(ns, cf.altName...)) + + if v.v.hasTagNameFunc { + v.str2 = string(append(structNs, cf.name...)) + } else { + v.str2 = v.str1 + } + + if ct.hasAlias { + + v.errs = append(v.errs, + &fieldError{ + v: v.v, + tag: ct.aliasTag, + actualTag: ct.actualAliasTag, + ns: v.str1, + structNs: v.str2, + fieldLen: uint8(len(cf.altName)), + structfieldLen: uint8(len(cf.name)), + value: getValue(current), + param: ct.param, + kind: kind, + typ: typ, + }, + ) + + } else { + + tVal := string(v.misc)[1:] + + v.errs = append(v.errs, + &fieldError{ + v: v.v, + tag: tVal, + actualTag: tVal, + ns: v.str1, + structNs: v.str2, + fieldLen: uint8(len(cf.altName)), + structfieldLen: uint8(len(cf.name)), + value: getValue(current), + param: ct.param, + kind: kind, + typ: typ, + }, + ) + } + + return + } + + ct = ct.next + } + + default: + + // set Field Level fields + v.slflParent = parent + v.flField = current + v.cf = cf + v.ct = ct + + if !ct.fn(ctx, v) { + v.str1 = string(append(ns, cf.altName...)) + + if v.v.hasTagNameFunc { + v.str2 = string(append(structNs, cf.name...)) + } else { + v.str2 = v.str1 + } + + v.errs = append(v.errs, + &fieldError{ + v: v.v, + tag: ct.aliasTag, + actualTag: ct.tag, + ns: v.str1, + structNs: v.str2, + fieldLen: uint8(len(cf.altName)), + structfieldLen: uint8(len(cf.name)), + value: getValue(current), + param: ct.param, + kind: kind, + typ: typ, + }, + ) + + return + } + ct = ct.next + } + } + +} + +func getValue(val reflect.Value) interface{} { + if val.CanInterface() { + return val.Interface() + } + + if val.CanAddr() { + return reflect.NewAt(val.Type(), unsafe.Pointer(val.UnsafeAddr())).Elem().Interface() + } + + switch val.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return val.Int() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return val.Uint() + case reflect.Complex64, reflect.Complex128: + return val.Complex() + case reflect.Float32, reflect.Float64: + return val.Float() + default: + return val.String() + } +} diff --git a/vendor/github.com/go-playground/validator/v10/validator_instance.go b/vendor/github.com/go-playground/validator/v10/validator_instance.go new file mode 100644 index 00000000..d9f148db --- /dev/null +++ b/vendor/github.com/go-playground/validator/v10/validator_instance.go @@ -0,0 +1,710 @@ +package validator + +import ( + "context" + "errors" + "fmt" + "reflect" + "strings" + "sync" + "time" + + ut "github.com/go-playground/universal-translator" +) + +const ( + defaultTagName = "validate" + utf8HexComma = "0x2C" + utf8Pipe = "0x7C" + tagSeparator = "," + orSeparator = "|" + tagKeySeparator = "=" + structOnlyTag = "structonly" + noStructLevelTag = "nostructlevel" + omitempty = "omitempty" + omitnil = "omitnil" + isdefault = "isdefault" + requiredWithoutAllTag = "required_without_all" + requiredWithoutTag = "required_without" + requiredWithTag = "required_with" + requiredWithAllTag = "required_with_all" + requiredIfTag = "required_if" + requiredUnlessTag = "required_unless" + skipUnlessTag = "skip_unless" + excludedWithoutAllTag = "excluded_without_all" + excludedWithoutTag = "excluded_without" + excludedWithTag = "excluded_with" + excludedWithAllTag = "excluded_with_all" + excludedIfTag = "excluded_if" + excludedUnlessTag = "excluded_unless" + skipValidationTag = "-" + diveTag = "dive" + keysTag = "keys" + endKeysTag = "endkeys" + requiredTag = "required" + namespaceSeparator = "." + leftBracket = "[" + rightBracket = "]" + restrictedTagChars = ".[],|=+()`~!@#$%^&*\\\"/?<>{}" + restrictedAliasErr = "Alias '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation" + restrictedTagErr = "Tag '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation" +) + +var ( + timeDurationType = reflect.TypeOf(time.Duration(0)) + timeType = reflect.TypeOf(time.Time{}) + + byteSliceType = reflect.TypeOf([]byte{}) + + defaultCField = &cField{namesEqual: true} +) + +// FilterFunc is the type used to filter fields using +// StructFiltered(...) function. +// returning true results in the field being filtered/skipped from +// validation +type FilterFunc func(ns []byte) bool + +// CustomTypeFunc allows for overriding or adding custom field type handler functions +// field = field value of the type to return a value to be validated +// example Valuer from sql drive see https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29 +type CustomTypeFunc func(field reflect.Value) interface{} + +// TagNameFunc allows for adding of a custom tag name parser +type TagNameFunc func(field reflect.StructField) string + +type internalValidationFuncWrapper struct { + fn FuncCtx + runValidationOnNil bool +} + +// Validate contains the validator settings and cache +type Validate struct { + tagName string + pool *sync.Pool + tagNameFunc TagNameFunc + structLevelFuncs map[reflect.Type]StructLevelFuncCtx + customFuncs map[reflect.Type]CustomTypeFunc + aliases map[string]string + validations map[string]internalValidationFuncWrapper + transTagFunc map[ut.Translator]map[string]TranslationFunc // map[]map[]TranslationFunc + rules map[reflect.Type]map[string]string + tagCache *tagCache + structCache *structCache + hasCustomFuncs bool + hasTagNameFunc bool + requiredStructEnabled bool + privateFieldValidation bool +} + +// New returns a new instance of 'validate' with sane defaults. +// Validate is designed to be thread-safe and used as a singleton instance. +// It caches information about your struct and validations, +// in essence only parsing your validation tags once per struct type. +// Using multiple instances neglects the benefit of caching. +func New(options ...Option) *Validate { + + tc := new(tagCache) + tc.m.Store(make(map[string]*cTag)) + + sc := new(structCache) + sc.m.Store(make(map[reflect.Type]*cStruct)) + + v := &Validate{ + tagName: defaultTagName, + aliases: make(map[string]string, len(bakedInAliases)), + validations: make(map[string]internalValidationFuncWrapper, len(bakedInValidators)), + tagCache: tc, + structCache: sc, + } + + // must copy alias validators for separate validations to be used in each validator instance + for k, val := range bakedInAliases { + v.RegisterAlias(k, val) + } + + // must copy validators for separate validations to be used in each instance + for k, val := range bakedInValidators { + + switch k { + // these require that even if the value is nil that the validation should run, omitempty still overrides this behaviour + case requiredIfTag, requiredUnlessTag, requiredWithTag, requiredWithAllTag, requiredWithoutTag, requiredWithoutAllTag, + excludedIfTag, excludedUnlessTag, excludedWithTag, excludedWithAllTag, excludedWithoutTag, excludedWithoutAllTag, + skipUnlessTag: + _ = v.registerValidation(k, wrapFunc(val), true, true) + default: + // no need to error check here, baked in will always be valid + _ = v.registerValidation(k, wrapFunc(val), true, false) + } + } + + v.pool = &sync.Pool{ + New: func() interface{} { + return &validate{ + v: v, + ns: make([]byte, 0, 64), + actualNs: make([]byte, 0, 64), + misc: make([]byte, 32), + } + }, + } + + for _, o := range options { + o(v) + } + return v +} + +// SetTagName allows for changing of the default tag name of 'validate' +func (v *Validate) SetTagName(name string) { + v.tagName = name +} + +// ValidateMapCtx validates a map using a map of validation rules and allows passing of contextual +// validation information via context.Context. +func (v Validate) ValidateMapCtx(ctx context.Context, data map[string]interface{}, rules map[string]interface{}) map[string]interface{} { + errs := make(map[string]interface{}) + for field, rule := range rules { + if ruleObj, ok := rule.(map[string]interface{}); ok { + if dataObj, ok := data[field].(map[string]interface{}); ok { + err := v.ValidateMapCtx(ctx, dataObj, ruleObj) + if len(err) > 0 { + errs[field] = err + } + } else if dataObjs, ok := data[field].([]map[string]interface{}); ok { + for _, obj := range dataObjs { + err := v.ValidateMapCtx(ctx, obj, ruleObj) + if len(err) > 0 { + errs[field] = err + } + } + } else { + errs[field] = errors.New("The field: '" + field + "' is not a map to dive") + } + } else if ruleStr, ok := rule.(string); ok { + err := v.VarCtx(ctx, data[field], ruleStr) + if err != nil { + errs[field] = err + } + } + } + return errs +} + +// ValidateMap validates map data from a map of tags +func (v *Validate) ValidateMap(data map[string]interface{}, rules map[string]interface{}) map[string]interface{} { + return v.ValidateMapCtx(context.Background(), data, rules) +} + +// RegisterTagNameFunc registers a function to get alternate names for StructFields. +// +// eg. to use the names which have been specified for JSON representations of structs, rather than normal Go field names: +// +// validate.RegisterTagNameFunc(func(fld reflect.StructField) string { +// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0] +// // skip if tag key says it should be ignored +// if name == "-" { +// return "" +// } +// return name +// }) +func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) { + v.tagNameFunc = fn + v.hasTagNameFunc = true +} + +// RegisterValidation adds a validation with the given tag +// +// NOTES: +// - if the key already exists, the previous validation function will be replaced. +// - this method is not thread-safe it is intended that these all be registered prior to any validation +func (v *Validate) RegisterValidation(tag string, fn Func, callValidationEvenIfNull ...bool) error { + return v.RegisterValidationCtx(tag, wrapFunc(fn), callValidationEvenIfNull...) +} + +// RegisterValidationCtx does the same as RegisterValidation on accepts a FuncCtx validation +// allowing context.Context validation support. +func (v *Validate) RegisterValidationCtx(tag string, fn FuncCtx, callValidationEvenIfNull ...bool) error { + var nilCheckable bool + if len(callValidationEvenIfNull) > 0 { + nilCheckable = callValidationEvenIfNull[0] + } + return v.registerValidation(tag, fn, false, nilCheckable) +} + +func (v *Validate) registerValidation(tag string, fn FuncCtx, bakedIn bool, nilCheckable bool) error { + if len(tag) == 0 { + return errors.New("function Key cannot be empty") + } + + if fn == nil { + return errors.New("function cannot be empty") + } + + _, ok := restrictedTags[tag] + if !bakedIn && (ok || strings.ContainsAny(tag, restrictedTagChars)) { + panic(fmt.Sprintf(restrictedTagErr, tag)) + } + v.validations[tag] = internalValidationFuncWrapper{fn: fn, runValidationOnNil: nilCheckable} + return nil +} + +// RegisterAlias registers a mapping of a single validation tag that +// defines a common or complex set of validation(s) to simplify adding validation +// to structs. +// +// NOTE: this function is not thread-safe it is intended that these all be registered prior to any validation +func (v *Validate) RegisterAlias(alias, tags string) { + + _, ok := restrictedTags[alias] + + if ok || strings.ContainsAny(alias, restrictedTagChars) { + panic(fmt.Sprintf(restrictedAliasErr, alias)) + } + + v.aliases[alias] = tags +} + +// RegisterStructValidation registers a StructLevelFunc against a number of types. +// +// NOTE: +// - this method is not thread-safe it is intended that these all be registered prior to any validation +func (v *Validate) RegisterStructValidation(fn StructLevelFunc, types ...interface{}) { + v.RegisterStructValidationCtx(wrapStructLevelFunc(fn), types...) +} + +// RegisterStructValidationCtx registers a StructLevelFuncCtx against a number of types and allows passing +// of contextual validation information via context.Context. +// +// NOTE: +// - this method is not thread-safe it is intended that these all be registered prior to any validation +func (v *Validate) RegisterStructValidationCtx(fn StructLevelFuncCtx, types ...interface{}) { + + if v.structLevelFuncs == nil { + v.structLevelFuncs = make(map[reflect.Type]StructLevelFuncCtx) + } + + for _, t := range types { + tv := reflect.ValueOf(t) + if tv.Kind() == reflect.Ptr { + t = reflect.Indirect(tv).Interface() + } + + v.structLevelFuncs[reflect.TypeOf(t)] = fn + } +} + +// RegisterStructValidationMapRules registers validate map rules. +// Be aware that map validation rules supersede those defined on a/the struct if present. +// +// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation +func (v *Validate) RegisterStructValidationMapRules(rules map[string]string, types ...interface{}) { + if v.rules == nil { + v.rules = make(map[reflect.Type]map[string]string) + } + + deepCopyRules := make(map[string]string) + for i, rule := range rules { + deepCopyRules[i] = rule + } + + for _, t := range types { + typ := reflect.TypeOf(t) + + if typ.Kind() == reflect.Ptr { + typ = typ.Elem() + } + + if typ.Kind() != reflect.Struct { + continue + } + v.rules[typ] = deepCopyRules + } +} + +// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types +// +// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation +func (v *Validate) RegisterCustomTypeFunc(fn CustomTypeFunc, types ...interface{}) { + + if v.customFuncs == nil { + v.customFuncs = make(map[reflect.Type]CustomTypeFunc) + } + + for _, t := range types { + v.customFuncs[reflect.TypeOf(t)] = fn + } + + v.hasCustomFuncs = true +} + +// RegisterTranslation registers translations against the provided tag. +func (v *Validate) RegisterTranslation(tag string, trans ut.Translator, registerFn RegisterTranslationsFunc, translationFn TranslationFunc) (err error) { + + if v.transTagFunc == nil { + v.transTagFunc = make(map[ut.Translator]map[string]TranslationFunc) + } + + if err = registerFn(trans); err != nil { + return + } + + m, ok := v.transTagFunc[trans] + if !ok { + m = make(map[string]TranslationFunc) + v.transTagFunc[trans] = m + } + + m[tag] = translationFn + + return +} + +// Struct validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified. +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +func (v *Validate) Struct(s interface{}) error { + return v.StructCtx(context.Background(), s) +} + +// StructCtx validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified +// and also allows passing of context.Context for contextual validation information. +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +func (v *Validate) StructCtx(ctx context.Context, s interface{}) (err error) { + + val := reflect.ValueOf(s) + top := val + + if val.Kind() == reflect.Ptr && !val.IsNil() { + val = val.Elem() + } + + if val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) { + return &InvalidValidationError{Type: reflect.TypeOf(s)} + } + + // good to validate + vd := v.pool.Get().(*validate) + vd.top = top + vd.isPartial = false + // vd.hasExcludes = false // only need to reset in StructPartial and StructExcept + + vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil) + + if len(vd.errs) > 0 { + err = vd.errs + vd.errs = nil + } + + v.pool.Put(vd) + + return +} + +// StructFiltered validates a structs exposed fields, that pass the FilterFunc check and automatically validates +// nested structs, unless otherwise specified. +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +func (v *Validate) StructFiltered(s interface{}, fn FilterFunc) error { + return v.StructFilteredCtx(context.Background(), s, fn) +} + +// StructFilteredCtx validates a structs exposed fields, that pass the FilterFunc check and automatically validates +// nested structs, unless otherwise specified and also allows passing of contextual validation information via +// context.Context +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +func (v *Validate) StructFilteredCtx(ctx context.Context, s interface{}, fn FilterFunc) (err error) { + val := reflect.ValueOf(s) + top := val + + if val.Kind() == reflect.Ptr && !val.IsNil() { + val = val.Elem() + } + + if val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) { + return &InvalidValidationError{Type: reflect.TypeOf(s)} + } + + // good to validate + vd := v.pool.Get().(*validate) + vd.top = top + vd.isPartial = true + vd.ffn = fn + // vd.hasExcludes = false // only need to reset in StructPartial and StructExcept + + vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil) + + if len(vd.errs) > 0 { + err = vd.errs + vd.errs = nil + } + + v.pool.Put(vd) + + return +} + +// StructPartial validates the fields passed in only, ignoring all others. +// Fields may be provided in a namespaced fashion relative to the struct provided +// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +func (v *Validate) StructPartial(s interface{}, fields ...string) error { + return v.StructPartialCtx(context.Background(), s, fields...) +} + +// StructPartialCtx validates the fields passed in only, ignoring all others and allows passing of contextual +// validation information via context.Context +// Fields may be provided in a namespaced fashion relative to the struct provided +// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +func (v *Validate) StructPartialCtx(ctx context.Context, s interface{}, fields ...string) (err error) { + val := reflect.ValueOf(s) + top := val + + if val.Kind() == reflect.Ptr && !val.IsNil() { + val = val.Elem() + } + + if val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) { + return &InvalidValidationError{Type: reflect.TypeOf(s)} + } + + // good to validate + vd := v.pool.Get().(*validate) + vd.top = top + vd.isPartial = true + vd.ffn = nil + vd.hasExcludes = false + vd.includeExclude = make(map[string]struct{}) + + typ := val.Type() + name := typ.Name() + + for _, k := range fields { + + flds := strings.Split(k, namespaceSeparator) + if len(flds) > 0 { + + vd.misc = append(vd.misc[0:0], name...) + // Don't append empty name for unnamed structs + if len(vd.misc) != 0 { + vd.misc = append(vd.misc, '.') + } + + for _, s := range flds { + + idx := strings.Index(s, leftBracket) + + if idx != -1 { + for idx != -1 { + vd.misc = append(vd.misc, s[:idx]...) + vd.includeExclude[string(vd.misc)] = struct{}{} + + idx2 := strings.Index(s, rightBracket) + idx2++ + vd.misc = append(vd.misc, s[idx:idx2]...) + vd.includeExclude[string(vd.misc)] = struct{}{} + s = s[idx2:] + idx = strings.Index(s, leftBracket) + } + } else { + + vd.misc = append(vd.misc, s...) + vd.includeExclude[string(vd.misc)] = struct{}{} + } + + vd.misc = append(vd.misc, '.') + } + } + } + + vd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil) + + if len(vd.errs) > 0 { + err = vd.errs + vd.errs = nil + } + + v.pool.Put(vd) + + return +} + +// StructExcept validates all fields except the ones passed in. +// Fields may be provided in a namespaced fashion relative to the struct provided +// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +func (v *Validate) StructExcept(s interface{}, fields ...string) error { + return v.StructExceptCtx(context.Background(), s, fields...) +} + +// StructExceptCtx validates all fields except the ones passed in and allows passing of contextual +// validation information via context.Context +// Fields may be provided in a namespaced fashion relative to the struct provided +// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +func (v *Validate) StructExceptCtx(ctx context.Context, s interface{}, fields ...string) (err error) { + val := reflect.ValueOf(s) + top := val + + if val.Kind() == reflect.Ptr && !val.IsNil() { + val = val.Elem() + } + + if val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) { + return &InvalidValidationError{Type: reflect.TypeOf(s)} + } + + // good to validate + vd := v.pool.Get().(*validate) + vd.top = top + vd.isPartial = true + vd.ffn = nil + vd.hasExcludes = true + vd.includeExclude = make(map[string]struct{}) + + typ := val.Type() + name := typ.Name() + + for _, key := range fields { + + vd.misc = vd.misc[0:0] + + if len(name) > 0 { + vd.misc = append(vd.misc, name...) + vd.misc = append(vd.misc, '.') + } + + vd.misc = append(vd.misc, key...) + vd.includeExclude[string(vd.misc)] = struct{}{} + } + + vd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil) + + if len(vd.errs) > 0 { + err = vd.errs + vd.errs = nil + } + + v.pool.Put(vd) + + return +} + +// Var validates a single variable using tag style validation. +// eg. +// var i int +// validate.Var(i, "gt=1,lt=10") +// +// WARNING: a struct can be passed for validation eg. time.Time is a struct or +// if you have a custom type and have registered a custom type handler, so must +// allow it; however unforeseen validations will occur if trying to validate a +// struct that is meant to be passed to 'validate.Struct' +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +// validate Array, Slice and maps fields which may contain more than one error +func (v *Validate) Var(field interface{}, tag string) error { + return v.VarCtx(context.Background(), field, tag) +} + +// VarCtx validates a single variable using tag style validation and allows passing of contextual +// validation information via context.Context. +// eg. +// var i int +// validate.Var(i, "gt=1,lt=10") +// +// WARNING: a struct can be passed for validation eg. time.Time is a struct or +// if you have a custom type and have registered a custom type handler, so must +// allow it; however unforeseen validations will occur if trying to validate a +// struct that is meant to be passed to 'validate.Struct' +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +// validate Array, Slice and maps fields which may contain more than one error +func (v *Validate) VarCtx(ctx context.Context, field interface{}, tag string) (err error) { + if len(tag) == 0 || tag == skipValidationTag { + return nil + } + + ctag := v.fetchCacheTag(tag) + + val := reflect.ValueOf(field) + vd := v.pool.Get().(*validate) + vd.top = val + vd.isPartial = false + vd.traverseField(ctx, val, val, vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag) + + if len(vd.errs) > 0 { + err = vd.errs + vd.errs = nil + } + v.pool.Put(vd) + return +} + +// VarWithValue validates a single variable, against another variable/field's value using tag style validation +// eg. +// s1 := "abcd" +// s2 := "abcd" +// validate.VarWithValue(s1, s2, "eqcsfield") // returns true +// +// WARNING: a struct can be passed for validation eg. time.Time is a struct or +// if you have a custom type and have registered a custom type handler, so must +// allow it; however unforeseen validations will occur if trying to validate a +// struct that is meant to be passed to 'validate.Struct' +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +// validate Array, Slice and maps fields which may contain more than one error +func (v *Validate) VarWithValue(field interface{}, other interface{}, tag string) error { + return v.VarWithValueCtx(context.Background(), field, other, tag) +} + +// VarWithValueCtx validates a single variable, against another variable/field's value using tag style validation and +// allows passing of contextual validation information via context.Context. +// eg. +// s1 := "abcd" +// s2 := "abcd" +// validate.VarWithValue(s1, s2, "eqcsfield") // returns true +// +// WARNING: a struct can be passed for validation eg. time.Time is a struct or +// if you have a custom type and have registered a custom type handler, so must +// allow it; however unforeseen validations will occur if trying to validate a +// struct that is meant to be passed to 'validate.Struct' +// +// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. +// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. +// validate Array, Slice and maps fields which may contain more than one error +func (v *Validate) VarWithValueCtx(ctx context.Context, field interface{}, other interface{}, tag string) (err error) { + if len(tag) == 0 || tag == skipValidationTag { + return nil + } + ctag := v.fetchCacheTag(tag) + otherVal := reflect.ValueOf(other) + vd := v.pool.Get().(*validate) + vd.top = otherVal + vd.isPartial = false + vd.traverseField(ctx, otherVal, reflect.ValueOf(field), vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag) + + if len(vd.errs) > 0 { + err = vd.errs + vd.errs = nil + } + v.pool.Put(vd) + return +} diff --git a/vendor/github.com/gogo/protobuf/proto/lib.go b/vendor/github.com/gogo/protobuf/proto/lib.go index 10eec0d0..80db1c15 100644 --- a/vendor/github.com/gogo/protobuf/proto/lib.go +++ b/vendor/github.com/gogo/protobuf/proto/lib.go @@ -39,35 +39,35 @@ for a protocol buffer variable v: - Names are turned from camel_case to CamelCase for export. - There are no methods on v to set fields; just treat - them as structure fields. + them as structure fields. - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. + and return the field's default value if unset. + The getters work even if the receiver is a nil message. - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. + All desired fields must be set before marshaling. - A Reset() method will restore a protobuf struct to its zero state. - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. + That is, optional or required field int32 f becomes F *int32. - Repeated fields are slices. - Helper functions are available to aid the setting of fields. - msg.Foo = proto.String("hello") // set field + msg.Foo = proto.String("hello") // set field - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. - Enums are given type names and maps from names to values. - Enum values are prefixed by the enclosing message's name, or by the - enum's type name if it is a top-level enum. Enum types have a String - method, and a Enum method to assist in message construction. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. - Nested messages, groups and enums have type names prefixed with the name of - the surrounding message type. + the surrounding message type. - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. - Oneof field sets are given a single field in their message, - with distinguished wrapper types for each possible field value. + with distinguished wrapper types for each possible field value. - Marshal and Unmarshal are functions to encode and decode the wire format. When the .proto file specifies `syntax="proto3"`, there are some differences: diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go index 461d5821..b6cad908 100644 --- a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go @@ -29,7 +29,6 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//go:build purego || appengine || js // +build purego appengine js // This file contains an implementation of proto field accesses using package reflect. diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go index d6e07e2f..7ffd3c29 100644 --- a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go @@ -26,7 +26,6 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//go:build purego || appengine || js // +build purego appengine js // This file contains an implementation of proto field accesses using package reflect. diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go index c998399b..d55a335d 100644 --- a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go @@ -29,7 +29,6 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//go:build !purego && !appengine && !js // +build !purego,!appengine,!js // This file contains the implementation of the proto field accesses using package unsafe. diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go index 57a14965..aca8eed0 100644 --- a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go @@ -26,7 +26,6 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//go:build !purego && !appengine && !js // +build !purego,!appengine,!js // This file contains the implementation of the proto field accesses using package unsafe. diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go index 7c3e9e00..93722938 100644 --- a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go +++ b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go @@ -2004,14 +2004,12 @@ func makeUnmarshalMap(f *reflect.StructField) unmarshaler { // makeUnmarshalOneof makes an unmarshaler for oneof fields. // for: -// -// message Msg { -// oneof F { -// int64 X = 1; -// float64 Y = 2; -// } -// } -// +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } // typ is the type of the concrete entry for a oneof case (e.g. Msg_X). // ityp is the interface type of the oneof field (e.g. isMsg_F). // unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). diff --git a/vendor/github.com/google/uuid/dce.go b/vendor/github.com/google/uuid/dce.go index 9302a1c1..fa820b9d 100644 --- a/vendor/github.com/google/uuid/dce.go +++ b/vendor/github.com/google/uuid/dce.go @@ -42,7 +42,7 @@ func NewDCESecurity(domain Domain, id uint32) (UUID, error) { // NewDCEPerson returns a DCE Security (Version 2) UUID in the person // domain with the id returned by os.Getuid. // -// NewDCESecurity(Person, uint32(os.Getuid())) +// NewDCESecurity(Person, uint32(os.Getuid())) func NewDCEPerson() (UUID, error) { return NewDCESecurity(Person, uint32(os.Getuid())) } @@ -50,7 +50,7 @@ func NewDCEPerson() (UUID, error) { // NewDCEGroup returns a DCE Security (Version 2) UUID in the group // domain with the id returned by os.Getgid. // -// NewDCESecurity(Group, uint32(os.Getgid())) +// NewDCESecurity(Group, uint32(os.Getgid())) func NewDCEGroup() (UUID, error) { return NewDCESecurity(Group, uint32(os.Getgid())) } diff --git a/vendor/github.com/google/uuid/hash.go b/vendor/github.com/google/uuid/hash.go index cee37578..dc60082d 100644 --- a/vendor/github.com/google/uuid/hash.go +++ b/vendor/github.com/google/uuid/hash.go @@ -45,7 +45,7 @@ func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { // NewMD5 returns a new MD5 (Version 3) UUID based on the // supplied name space and data. It is the same as calling: // -// NewHash(md5.New(), space, data, 3) +// NewHash(md5.New(), space, data, 3) func NewMD5(space UUID, data []byte) UUID { return NewHash(md5.New(), space, data, 3) } @@ -53,7 +53,7 @@ func NewMD5(space UUID, data []byte) UUID { // NewSHA1 returns a new SHA1 (Version 5) UUID based on the // supplied name space and data. It is the same as calling: // -// NewHash(sha1.New(), space, data, 5) +// NewHash(sha1.New(), space, data, 5) func NewSHA1(space UUID, data []byte) UUID { return NewHash(sha1.New(), space, data, 5) } diff --git a/vendor/github.com/google/uuid/node_js.go b/vendor/github.com/google/uuid/node_js.go index f745d701..b2a0bc87 100644 --- a/vendor/github.com/google/uuid/node_js.go +++ b/vendor/github.com/google/uuid/node_js.go @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build js // +build js package uuid diff --git a/vendor/github.com/google/uuid/node_net.go b/vendor/github.com/google/uuid/node_net.go index e91358f7..0cbbcddb 100644 --- a/vendor/github.com/google/uuid/node_net.go +++ b/vendor/github.com/google/uuid/node_net.go @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !js // +build !js package uuid diff --git a/vendor/github.com/google/uuid/null.go b/vendor/github.com/google/uuid/null.go index 06ecf9de..d7fcbf28 100644 --- a/vendor/github.com/google/uuid/null.go +++ b/vendor/github.com/google/uuid/null.go @@ -17,14 +17,15 @@ var jsonNull = []byte("null") // NullUUID implements the SQL driver.Scanner interface so // it can be used as a scan destination: // -// var u uuid.NullUUID -// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u) -// ... -// if u.Valid { -// // use u.UUID -// } else { -// // NULL value -// } +// var u uuid.NullUUID +// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u) +// ... +// if u.Valid { +// // use u.UUID +// } else { +// // NULL value +// } +// type NullUUID struct { UUID UUID Valid bool // Valid is true if UUID is not NULL diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go index 1051192b..5232b486 100644 --- a/vendor/github.com/google/uuid/uuid.go +++ b/vendor/github.com/google/uuid/uuid.go @@ -187,12 +187,10 @@ func Must(uuid UUID, err error) 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} -// +// 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) { diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go index 62ac2738..7697802e 100644 --- a/vendor/github.com/google/uuid/version4.go +++ b/vendor/github.com/google/uuid/version4.go @@ -9,7 +9,7 @@ import "io" // New creates a new random UUID or panics. New is equivalent to // the expression // -// uuid.Must(uuid.NewRandom()) +// uuid.Must(uuid.NewRandom()) func New() UUID { return Must(NewRandom()) } @@ -17,7 +17,7 @@ func New() UUID { // NewString creates a new random UUID and returns it as a string or panics. // NewString is equivalent to the expression // -// uuid.New().String() +// uuid.New().String() func NewString() string { return Must(NewRandom()).String() } @@ -31,11 +31,11 @@ func NewString() string { // // A note about uniqueness derived from the UUID Wikipedia entry: // -// Randomly generated UUIDs have 122 random bits. One's annual risk of being -// hit by a meteorite is estimated to be one chance in 17 billion, that -// means the probability is about 0.00000000006 (6 × 10−11), -// equivalent to the odds of creating a few tens of trillions of UUIDs in a -// year and having one duplicate. +// Randomly generated UUIDs have 122 random bits. One's annual risk of being +// hit by a meteorite is estimated to be one chance in 17 billion, that +// means the probability is about 0.00000000006 (6 × 10−11), +// equivalent to the odds of creating a few tens of trillions of UUIDs in a +// year and having one duplicate. func NewRandom() (UUID, error) { if !poolEnabled { return NewRandomFromReader(rander) diff --git a/vendor/github.com/leodido/go-urn/.gitignore b/vendor/github.com/leodido/go-urn/.gitignore new file mode 100644 index 00000000..427454f8 --- /dev/null +++ b/vendor/github.com/leodido/go-urn/.gitignore @@ -0,0 +1,13 @@ +*.exe +*.dll +*.so +*.dylib + +*.test + +*.out +*.txt + +vendor/ +/removecomments +/snake2camel \ No newline at end of file diff --git a/vendor/github.com/leodido/go-urn/LICENSE b/vendor/github.com/leodido/go-urn/LICENSE new file mode 100644 index 00000000..8c3504a5 --- /dev/null +++ b/vendor/github.com/leodido/go-urn/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Leonardo Di Donato + +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/leodido/go-urn/README.md b/vendor/github.com/leodido/go-urn/README.md new file mode 100644 index 00000000..619475bf --- /dev/null +++ b/vendor/github.com/leodido/go-urn/README.md @@ -0,0 +1,153 @@ +[![Build](https://img.shields.io/circleci/build/github/leodido/go-urn?style=for-the-badge)](https://app.circleci.com/pipelines/github/leodido/go-urn) [![Coverage](https://img.shields.io/codecov/c/github/leodido/go-urn.svg?style=for-the-badge)](https://codecov.io/gh/leodido/go-urn) [![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=for-the-badge)](https://godoc.org/github.com/leodido/go-urn) + +**A parser for URNs**. + +> As seen on [RFC 2141](https://datatracker.ietf.org/doc/html/rfc2141), [RFC 7643](https://datatracker.ietf.org/doc/html/rfc7643#section-10), and on [RFC 8141](https://datatracker.ietf.org/doc/html/rfc8141). + +[API documentation](https://godoc.org/github.com/leodido/go-urn). + +Starting with version 1.3 this library also supports [RFC 7643 SCIM URNs](https://datatracker.ietf.org/doc/html/rfc7643#section-10). + +Starting with version 1.4 this library also supports [RFC 8141 URNs (2017)](https://datatracker.ietf.org/doc/html/rfc8141). + +## Installation + +``` +go get github.com/leodido/go-urn +``` + +## Features + +1. RFC 2141 URNs parsing (default) +2. RFC 8141 URNs parsing (supersedes RFC 2141) +3. RFC 7643 SCIM URNs parsing +4. Normalization as per RFCs +5. Lexical equivalence as per RFCs +6. Precise, fine-grained errors + +## Performances + +This implementation results to be really fast. + +Usually below 400 ns on my machine[1](#mymachine). + +Notice it also performs, while parsing: + +1. fine-grained and informative erroring +2. specific-string normalization + +``` +ok/00/urn:a:b______________________________________/-10 51372006 109.0 ns/op 275 B/op 3 allocs/op +ok/01/URN:foo:a123,456_____________________________/-10 36024072 160.8 ns/op 296 B/op 6 allocs/op +ok/02/urn:foo:a123%2C456___________________________/-10 31901007 188.4 ns/op 320 B/op 7 allocs/op +ok/03/urn:ietf:params:scim:schemas:core:2.0:User___/-10 22736756 266.6 ns/op 376 B/op 6 allocs/op +ok/04/urn:ietf:params:scim:schemas:extension:enterp/-10 18291859 335.2 ns/op 408 B/op 6 allocs/op +ok/05/urn:ietf:params:scim:schemas:extension:enterp/-10 15283087 379.4 ns/op 440 B/op 6 allocs/op +ok/06/urn:burnout:nss______________________________/-10 39407593 155.1 ns/op 288 B/op 6 allocs/op +ok/07/urn:abcdefghilmnopqrstuvzabcdefghilm:x_______/-10 27832718 211.4 ns/op 307 B/op 4 allocs/op +ok/08/urn:urnurnurn:urn____________________________/-10 33269596 168.1 ns/op 293 B/op 6 allocs/op +ok/09/urn:ciao:!!*_________________________________/-10 41100675 148.8 ns/op 288 B/op 6 allocs/op +ok/10/urn:ciao:=@__________________________________/-10 37214253 149.7 ns/op 284 B/op 6 allocs/op +ok/11/urn:ciao:@!=%2C(xyz)+a,b.*@g=$_'_____________/-10 26534240 229.8 ns/op 336 B/op 7 allocs/op +ok/12/URN:x:abc%1Dz%2F%3az_________________________/-10 28166396 211.8 ns/op 336 B/op 7 allocs/op +no/13/URN:---xxx:x_________________________________/-10 23635159 255.6 ns/op 419 B/op 5 allocs/op +no/14/urn::colon:nss_______________________________/-10 23594779 258.4 ns/op 419 B/op 5 allocs/op +no/15/URN:@,:x_____________________________________/-10 23742535 261.5 ns/op 419 B/op 5 allocs/op +no/16/URN:URN:NSS__________________________________/-10 27432714 223.3 ns/op 371 B/op 5 allocs/op +no/17/urn:UrN:NSS__________________________________/-10 26922117 224.9 ns/op 371 B/op 5 allocs/op +no/18/urn:a:%______________________________________/-10 24926733 224.6 ns/op 371 B/op 5 allocs/op +no/19/urn:urn:NSS__________________________________/-10 27652641 220.7 ns/op 371 B/op 5 allocs/op +``` + +* [1]: Apple M1 Pro + + +## Example + +For more examples take a look at the [examples file](examples_test.go). + + +```go +package main + +import ( + "fmt" + "github.com/leodido/go-urn" +) + +func main() { + var uid = "URN:foo:a123,456" + + // Parse the input string as a RFC 2141 URN only + u, e := urn.NewMachine().Parse(uid) + if e != nil { + fmt.Errorf(err) + + return + } + + fmt.Println(u.ID) + fmt.Println(u.SS) + + // Output: + // foo + // a123,456 +} +``` + +```go +package main + +import ( + "fmt" + "github.com/leodido/go-urn" +) + +func main() { + var uid = "URN:foo:a123,456" + + // Parse the input string as a RFC 2141 URN only + u, ok := urn.Parse([]byte(uid)) + if !ok { + panic("error parsing urn") + } + + fmt.Println(u.ID) + fmt.Println(u.SS) + + // Output: + // foo + // a123,456 +} +``` + +```go +package main + +import ( + "fmt" + "github.com/leodido/go-urn" +) + +func main() { + input := "urn:ietf:params:scim:api:messages:2.0:ListResponse" + + // Parsing the input string as a RFC 7643 SCIM URN + u, ok := urn.Parse([]byte(input), urn.WithParsingMode(urn.RFC7643Only)) + if !ok { + panic("error parsing urn") + } + + fmt.Println(u.IsSCIM()) + scim := u.SCIM() + fmt.Println(scim.Type.String()) + fmt.Println(scim.Name) + fmt.Println(scim.Other) + + // Output: + // true + // api + // messages + // 2.0:ListResponse +} +``` \ No newline at end of file diff --git a/vendor/github.com/leodido/go-urn/kind.go b/vendor/github.com/leodido/go-urn/kind.go new file mode 100644 index 00000000..f5e140f0 --- /dev/null +++ b/vendor/github.com/leodido/go-urn/kind.go @@ -0,0 +1,10 @@ +package urn + +type Kind int + +const ( + NONE Kind = iota + RFC2141 + RFC7643 + RFC8141 +) diff --git a/vendor/github.com/leodido/go-urn/machine.go b/vendor/github.com/leodido/go-urn/machine.go new file mode 100644 index 00000000..aec1ba69 --- /dev/null +++ b/vendor/github.com/leodido/go-urn/machine.go @@ -0,0 +1,5046 @@ +package urn + +import ( + "fmt" + + scimschema "github.com/leodido/go-urn/scim/schema" +) + +var ( + errPrefix = "expecting the prefix to be the \"urn\" string (whatever case) [col %d]" + errIdentifier = "expecting the identifier to be string (1..31 alnum chars, also containing dashes but not at its beginning) [col %d]" + errSpecificString = "expecting the specific string to be a string containing alnum, hex, or others ([()+,-.:=@;$_!*']) chars [col %d]" + errNoUrnWithinID = "expecting the identifier to not contain the \"urn\" reserved string [col %d]" + errHex = "expecting the percent encoded chars to be well-formed (%%alnum{2}) [col %d]" + errSCIMNamespace = "expecing the SCIM namespace identifier (ietf:params:scim) [col %d]" + errSCIMType = "expecting a correct SCIM type (schemas, api, param) [col %d]" + errSCIMName = "expecting one or more alnum char in the SCIM name part [col %d]" + errSCIMOther = "expecting a well-formed other SCIM part [col %d]" + errSCIMOtherIncomplete = "expecting a not empty SCIM other part after colon [col %d]" + err8141InformalID = "informal URN namespace must be in the form urn-[1-9][0-9] [col %d]" + err8141SpecificString = "expecting the specific string to contain alnum, hex, or others ([~&()+,-.:=@;$_!*'] or [/?] not in first position) chars [col %d]" + err8141Identifier = "expecting the indentifier to be a string with (length 2 to 32 chars) containing alnum (or dashes) not starting or ending with a dash [col %d]" + err8141RComponentStart = "expecting only one r-component (starting with the ?+ sequence) [col %d]" + err8141QComponentStart = "expecting only one q-component (starting with the ?= sequence) [col %d]" + err8141MalformedRComp = "expecting a non-empty r-component containing alnum, hex, or others ([~&()+,-.:=@;$_!*'] or [/?] but not at its beginning) [col %d]" + err8141MalformedQComp = "expecting a non-empty q-component containing alnum, hex, or others ([~&()+,-.:=@;$_!*'] or [/?] but not at its beginning) [col %d]" +) +var _toStateActions []byte = []byte{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 33, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, +} + +var _eofActions []byte = []byte{ + 0, 1, 1, 1, 1, 4, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 8, 9, + 9, 4, 4, 11, 1, 1, 1, 1, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 12, 14, 14, 14, 14, 16, 18, 20, + 20, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 1, 1, 1, 1, 21, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 23, 24, 24, 25, 25, 0, 26, 28, + 28, 29, 29, 30, 30, 26, 26, 31, + 31, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 21, + 21, 22, 22, 22, 34, 34, 35, 37, + 37, 38, 40, 41, 41, 38, 42, 42, + 42, 44, 42, 48, 48, 48, 50, 44, + 50, 0, +} + +const start int = 1 +const firstFinal int = 172 + +const enScimOnly int = 44 +const enRfc8141Only int = 83 +const enFail int = 193 +const enMain int = 1 + +// Machine is the interface representing the FSM +type Machine interface { + Error() error + Parse(input []byte) (*URN, error) + WithParsingMode(ParsingMode) +} + +type machine struct { + data []byte + cs int + p, pe, eof, pb int + err error + startParsingAt int + parsingMode ParsingMode + parsingModeSet bool +} + +// NewMachine creates a new FSM able to parse RFC 2141 strings. +func NewMachine(options ...Option) Machine { + m := &machine{ + parsingModeSet: false, + } + + for _, o := range options { + o(m) + } + // Set default parsing mode + if !m.parsingModeSet { + m.WithParsingMode(DefaultParsingMode) + } + + return m +} + +// Err returns the error that occurred on the last call to Parse. +// +// If the result is nil, then the line was parsed successfully. +func (m *machine) Error() error { + return m.err +} + +func (m *machine) text() []byte { + return m.data[m.pb:m.p] +} + +// Parse parses the input byte array as a RFC 2141 or RFC7643 string. +func (m *machine) Parse(input []byte) (*URN, error) { + m.data = input + m.p = 0 + m.pb = 0 + m.pe = len(input) + m.eof = len(input) + m.err = nil + m.cs = m.startParsingAt + output := &URN{ + tolower: []int{}, + } + { + if (m.p) == (m.pe) { + goto _testEof + } + if m.cs == 0 { + goto _out + } + _resume: + switch m.cs { + case 1: + switch (m.data)[(m.p)] { + case 85: + goto tr1 + case 117: + goto tr1 + } + goto tr0 + case 0: + goto _out + case 2: + switch (m.data)[(m.p)] { + case 82: + goto tr2 + case 114: + goto tr2 + } + goto tr0 + case 3: + switch (m.data)[(m.p)] { + case 78: + goto tr3 + case 110: + goto tr3 + } + goto tr0 + case 4: + if (m.data)[(m.p)] == 58 { + goto tr4 + } + goto tr0 + case 5: + switch (m.data)[(m.p)] { + case 85: + goto tr7 + case 117: + goto tr7 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr6 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr6 + } + default: + goto tr6 + } + goto tr5 + case 6: + switch (m.data)[(m.p)] { + case 45: + goto tr9 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr9 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr9 + } + default: + goto tr9 + } + goto tr8 + case 7: + switch (m.data)[(m.p)] { + case 45: + goto tr11 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr11 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr11 + } + default: + goto tr11 + } + goto tr8 + case 8: + switch (m.data)[(m.p)] { + case 45: + goto tr12 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr12 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr12 + } + default: + goto tr12 + } + goto tr8 + case 9: + switch (m.data)[(m.p)] { + case 45: + goto tr13 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr13 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr13 + } + default: + goto tr13 + } + goto tr8 + case 10: + switch (m.data)[(m.p)] { + case 45: + goto tr14 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr14 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr14 + } + default: + goto tr14 + } + goto tr8 + case 11: + switch (m.data)[(m.p)] { + case 45: + goto tr15 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr15 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr15 + } + default: + goto tr15 + } + goto tr8 + case 12: + switch (m.data)[(m.p)] { + case 45: + goto tr16 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr16 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr16 + } + default: + goto tr16 + } + goto tr8 + case 13: + switch (m.data)[(m.p)] { + case 45: + goto tr17 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr17 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr17 + } + default: + goto tr17 + } + goto tr8 + case 14: + switch (m.data)[(m.p)] { + case 45: + goto tr18 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr18 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr18 + } + default: + goto tr18 + } + goto tr8 + case 15: + switch (m.data)[(m.p)] { + case 45: + goto tr19 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr19 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr19 + } + default: + goto tr19 + } + goto tr8 + case 16: + switch (m.data)[(m.p)] { + case 45: + goto tr20 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr20 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr20 + } + default: + goto tr20 + } + goto tr8 + case 17: + switch (m.data)[(m.p)] { + case 45: + goto tr21 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr21 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr21 + } + default: + goto tr21 + } + goto tr8 + case 18: + switch (m.data)[(m.p)] { + case 45: + goto tr22 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr22 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr22 + } + default: + goto tr22 + } + goto tr8 + case 19: + switch (m.data)[(m.p)] { + case 45: + goto tr23 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr23 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr23 + } + default: + goto tr23 + } + goto tr8 + case 20: + switch (m.data)[(m.p)] { + case 45: + goto tr24 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr24 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr24 + } + default: + goto tr24 + } + goto tr8 + case 21: + switch (m.data)[(m.p)] { + case 45: + goto tr25 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr25 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr25 + } + default: + goto tr25 + } + goto tr8 + case 22: + switch (m.data)[(m.p)] { + case 45: + goto tr26 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr26 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr26 + } + default: + goto tr26 + } + goto tr8 + case 23: + switch (m.data)[(m.p)] { + case 45: + goto tr27 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr27 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr27 + } + default: + goto tr27 + } + goto tr8 + case 24: + switch (m.data)[(m.p)] { + case 45: + goto tr28 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr28 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr28 + } + default: + goto tr28 + } + goto tr8 + case 25: + switch (m.data)[(m.p)] { + case 45: + goto tr29 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr29 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr29 + } + default: + goto tr29 + } + goto tr8 + case 26: + switch (m.data)[(m.p)] { + case 45: + goto tr30 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr30 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr30 + } + default: + goto tr30 + } + goto tr8 + case 27: + switch (m.data)[(m.p)] { + case 45: + goto tr31 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr31 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr31 + } + default: + goto tr31 + } + goto tr8 + case 28: + switch (m.data)[(m.p)] { + case 45: + goto tr32 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr32 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr32 + } + default: + goto tr32 + } + goto tr8 + case 29: + switch (m.data)[(m.p)] { + case 45: + goto tr33 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr33 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr33 + } + default: + goto tr33 + } + goto tr8 + case 30: + switch (m.data)[(m.p)] { + case 45: + goto tr34 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr34 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr34 + } + default: + goto tr34 + } + goto tr8 + case 31: + switch (m.data)[(m.p)] { + case 45: + goto tr35 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr35 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr35 + } + default: + goto tr35 + } + goto tr8 + case 32: + switch (m.data)[(m.p)] { + case 45: + goto tr36 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr36 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr36 + } + default: + goto tr36 + } + goto tr8 + case 33: + switch (m.data)[(m.p)] { + case 45: + goto tr37 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr37 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr37 + } + default: + goto tr37 + } + goto tr8 + case 34: + switch (m.data)[(m.p)] { + case 45: + goto tr38 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr38 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr38 + } + default: + goto tr38 + } + goto tr8 + case 35: + switch (m.data)[(m.p)] { + case 45: + goto tr39 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr39 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr39 + } + default: + goto tr39 + } + goto tr8 + case 36: + switch (m.data)[(m.p)] { + case 45: + goto tr40 + case 58: + goto tr10 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr40 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr40 + } + default: + goto tr40 + } + goto tr8 + case 37: + if (m.data)[(m.p)] == 58 { + goto tr10 + } + goto tr8 + case 38: + switch (m.data)[(m.p)] { + case 33: + goto tr42 + case 36: + goto tr42 + case 37: + goto tr43 + case 61: + goto tr42 + case 95: + goto tr42 + } + switch { + case (m.data)[(m.p)] < 48: + if 39 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr42 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr42 + } + case (m.data)[(m.p)] >= 64: + goto tr42 + } + default: + goto tr42 + } + goto tr41 + case 172: + switch (m.data)[(m.p)] { + case 33: + goto tr212 + case 36: + goto tr212 + case 37: + goto tr213 + case 61: + goto tr212 + case 95: + goto tr212 + } + switch { + case (m.data)[(m.p)] < 48: + if 39 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr212 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr212 + } + case (m.data)[(m.p)] >= 64: + goto tr212 + } + default: + goto tr212 + } + goto tr41 + case 39: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr45 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr45 + } + default: + goto tr46 + } + goto tr44 + case 40: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr47 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr47 + } + default: + goto tr48 + } + goto tr44 + case 173: + switch (m.data)[(m.p)] { + case 33: + goto tr212 + case 36: + goto tr212 + case 37: + goto tr213 + case 61: + goto tr212 + case 95: + goto tr212 + } + switch { + case (m.data)[(m.p)] < 48: + if 39 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr212 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr212 + } + case (m.data)[(m.p)] >= 64: + goto tr212 + } + default: + goto tr212 + } + goto tr44 + case 41: + switch (m.data)[(m.p)] { + case 45: + goto tr9 + case 58: + goto tr10 + case 82: + goto tr49 + case 114: + goto tr49 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr9 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr9 + } + default: + goto tr9 + } + goto tr5 + case 42: + switch (m.data)[(m.p)] { + case 45: + goto tr11 + case 58: + goto tr10 + case 78: + goto tr50 + case 110: + goto tr50 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr11 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr11 + } + default: + goto tr11 + } + goto tr5 + case 43: + if (m.data)[(m.p)] == 45 { + goto tr12 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr12 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr12 + } + default: + goto tr12 + } + goto tr51 + case 44: + switch (m.data)[(m.p)] { + case 85: + goto tr52 + case 117: + goto tr52 + } + goto tr0 + case 45: + switch (m.data)[(m.p)] { + case 82: + goto tr53 + case 114: + goto tr53 + } + goto tr0 + case 46: + switch (m.data)[(m.p)] { + case 78: + goto tr54 + case 110: + goto tr54 + } + goto tr0 + case 47: + if (m.data)[(m.p)] == 58 { + goto tr55 + } + goto tr0 + case 48: + if (m.data)[(m.p)] == 105 { + goto tr57 + } + goto tr56 + case 49: + if (m.data)[(m.p)] == 101 { + goto tr58 + } + goto tr56 + case 50: + if (m.data)[(m.p)] == 116 { + goto tr59 + } + goto tr56 + case 51: + if (m.data)[(m.p)] == 102 { + goto tr60 + } + goto tr56 + case 52: + if (m.data)[(m.p)] == 58 { + goto tr61 + } + goto tr56 + case 53: + if (m.data)[(m.p)] == 112 { + goto tr62 + } + goto tr56 + case 54: + if (m.data)[(m.p)] == 97 { + goto tr63 + } + goto tr56 + case 55: + if (m.data)[(m.p)] == 114 { + goto tr64 + } + goto tr56 + case 56: + if (m.data)[(m.p)] == 97 { + goto tr65 + } + goto tr56 + case 57: + if (m.data)[(m.p)] == 109 { + goto tr66 + } + goto tr56 + case 58: + if (m.data)[(m.p)] == 115 { + goto tr67 + } + goto tr56 + case 59: + if (m.data)[(m.p)] == 58 { + goto tr68 + } + goto tr56 + case 60: + if (m.data)[(m.p)] == 115 { + goto tr69 + } + goto tr56 + case 61: + if (m.data)[(m.p)] == 99 { + goto tr70 + } + goto tr56 + case 62: + if (m.data)[(m.p)] == 105 { + goto tr71 + } + goto tr56 + case 63: + if (m.data)[(m.p)] == 109 { + goto tr72 + } + goto tr56 + case 64: + if (m.data)[(m.p)] == 58 { + goto tr73 + } + goto tr56 + case 65: + switch (m.data)[(m.p)] { + case 97: + goto tr75 + case 112: + goto tr76 + case 115: + goto tr77 + } + goto tr74 + case 66: + if (m.data)[(m.p)] == 112 { + goto tr78 + } + goto tr74 + case 67: + if (m.data)[(m.p)] == 105 { + goto tr79 + } + goto tr74 + case 68: + if (m.data)[(m.p)] == 58 { + goto tr80 + } + goto tr74 + case 69: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr82 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr82 + } + default: + goto tr82 + } + goto tr81 + case 174: + if (m.data)[(m.p)] == 58 { + goto tr215 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr214 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr214 + } + default: + goto tr214 + } + goto tr81 + case 70: + switch (m.data)[(m.p)] { + case 33: + goto tr84 + case 36: + goto tr84 + case 37: + goto tr85 + case 61: + goto tr84 + case 95: + goto tr84 + } + switch { + case (m.data)[(m.p)] < 48: + if 39 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr84 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr84 + } + case (m.data)[(m.p)] >= 64: + goto tr84 + } + default: + goto tr84 + } + goto tr83 + case 175: + switch (m.data)[(m.p)] { + case 33: + goto tr216 + case 36: + goto tr216 + case 37: + goto tr217 + case 61: + goto tr216 + case 95: + goto tr216 + } + switch { + case (m.data)[(m.p)] < 48: + if 39 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr216 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr216 + } + case (m.data)[(m.p)] >= 64: + goto tr216 + } + default: + goto tr216 + } + goto tr83 + case 71: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr87 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr87 + } + default: + goto tr88 + } + goto tr86 + case 72: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr89 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr89 + } + default: + goto tr90 + } + goto tr86 + case 176: + switch (m.data)[(m.p)] { + case 33: + goto tr216 + case 36: + goto tr216 + case 37: + goto tr217 + case 61: + goto tr216 + case 95: + goto tr216 + } + switch { + case (m.data)[(m.p)] < 48: + if 39 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr216 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr216 + } + case (m.data)[(m.p)] >= 64: + goto tr216 + } + default: + goto tr216 + } + goto tr86 + case 73: + if (m.data)[(m.p)] == 97 { + goto tr91 + } + goto tr74 + case 74: + if (m.data)[(m.p)] == 114 { + goto tr92 + } + goto tr74 + case 75: + if (m.data)[(m.p)] == 97 { + goto tr93 + } + goto tr74 + case 76: + if (m.data)[(m.p)] == 109 { + goto tr79 + } + goto tr74 + case 77: + if (m.data)[(m.p)] == 99 { + goto tr94 + } + goto tr74 + case 78: + if (m.data)[(m.p)] == 104 { + goto tr95 + } + goto tr74 + case 79: + if (m.data)[(m.p)] == 101 { + goto tr96 + } + goto tr74 + case 80: + if (m.data)[(m.p)] == 109 { + goto tr97 + } + goto tr74 + case 81: + if (m.data)[(m.p)] == 97 { + goto tr98 + } + goto tr74 + case 82: + if (m.data)[(m.p)] == 115 { + goto tr79 + } + goto tr74 + case 83: + switch (m.data)[(m.p)] { + case 85: + goto tr99 + case 117: + goto tr99 + } + goto tr0 + case 84: + switch (m.data)[(m.p)] { + case 82: + goto tr100 + case 114: + goto tr100 + } + goto tr0 + case 85: + switch (m.data)[(m.p)] { + case 78: + goto tr101 + case 110: + goto tr101 + } + goto tr0 + case 86: + if (m.data)[(m.p)] == 58 { + goto tr102 + } + goto tr0 + case 87: + switch (m.data)[(m.p)] { + case 85: + goto tr105 + case 117: + goto tr105 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr104 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr104 + } + default: + goto tr104 + } + goto tr103 + case 88: + if (m.data)[(m.p)] == 45 { + goto tr107 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr108 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr108 + } + default: + goto tr108 + } + goto tr106 + case 89: + if (m.data)[(m.p)] == 45 { + goto tr109 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr110 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr110 + } + default: + goto tr110 + } + goto tr106 + case 90: + if (m.data)[(m.p)] == 45 { + goto tr111 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr112 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr112 + } + default: + goto tr112 + } + goto tr106 + case 91: + if (m.data)[(m.p)] == 45 { + goto tr113 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr114 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr114 + } + default: + goto tr114 + } + goto tr106 + case 92: + if (m.data)[(m.p)] == 45 { + goto tr115 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr116 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr116 + } + default: + goto tr116 + } + goto tr106 + case 93: + if (m.data)[(m.p)] == 45 { + goto tr117 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr118 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr118 + } + default: + goto tr118 + } + goto tr106 + case 94: + if (m.data)[(m.p)] == 45 { + goto tr119 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr120 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr120 + } + default: + goto tr120 + } + goto tr106 + case 95: + if (m.data)[(m.p)] == 45 { + goto tr121 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr122 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr122 + } + default: + goto tr122 + } + goto tr106 + case 96: + if (m.data)[(m.p)] == 45 { + goto tr123 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr124 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr124 + } + default: + goto tr124 + } + goto tr106 + case 97: + if (m.data)[(m.p)] == 45 { + goto tr125 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr126 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr126 + } + default: + goto tr126 + } + goto tr106 + case 98: + if (m.data)[(m.p)] == 45 { + goto tr127 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr128 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr128 + } + default: + goto tr128 + } + goto tr106 + case 99: + if (m.data)[(m.p)] == 45 { + goto tr129 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr130 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr130 + } + default: + goto tr130 + } + goto tr106 + case 100: + if (m.data)[(m.p)] == 45 { + goto tr131 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr132 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr132 + } + default: + goto tr132 + } + goto tr106 + case 101: + if (m.data)[(m.p)] == 45 { + goto tr133 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr134 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr134 + } + default: + goto tr134 + } + goto tr106 + case 102: + if (m.data)[(m.p)] == 45 { + goto tr135 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr136 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr136 + } + default: + goto tr136 + } + goto tr106 + case 103: + if (m.data)[(m.p)] == 45 { + goto tr137 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr138 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr138 + } + default: + goto tr138 + } + goto tr106 + case 104: + if (m.data)[(m.p)] == 45 { + goto tr139 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr140 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr140 + } + default: + goto tr140 + } + goto tr106 + case 105: + if (m.data)[(m.p)] == 45 { + goto tr141 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr142 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr142 + } + default: + goto tr142 + } + goto tr106 + case 106: + if (m.data)[(m.p)] == 45 { + goto tr143 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr144 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr144 + } + default: + goto tr144 + } + goto tr106 + case 107: + if (m.data)[(m.p)] == 45 { + goto tr145 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr146 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr146 + } + default: + goto tr146 + } + goto tr106 + case 108: + if (m.data)[(m.p)] == 45 { + goto tr147 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr148 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr148 + } + default: + goto tr148 + } + goto tr106 + case 109: + if (m.data)[(m.p)] == 45 { + goto tr149 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr150 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr150 + } + default: + goto tr150 + } + goto tr106 + case 110: + if (m.data)[(m.p)] == 45 { + goto tr151 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr152 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr152 + } + default: + goto tr152 + } + goto tr106 + case 111: + if (m.data)[(m.p)] == 45 { + goto tr153 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr154 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr154 + } + default: + goto tr154 + } + goto tr106 + case 112: + if (m.data)[(m.p)] == 45 { + goto tr155 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr156 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr156 + } + default: + goto tr156 + } + goto tr106 + case 113: + if (m.data)[(m.p)] == 45 { + goto tr157 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr158 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr158 + } + default: + goto tr158 + } + goto tr106 + case 114: + if (m.data)[(m.p)] == 45 { + goto tr159 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr160 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr160 + } + default: + goto tr160 + } + goto tr106 + case 115: + if (m.data)[(m.p)] == 45 { + goto tr161 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr162 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr162 + } + default: + goto tr162 + } + goto tr106 + case 116: + if (m.data)[(m.p)] == 45 { + goto tr163 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr164 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr164 + } + default: + goto tr164 + } + goto tr106 + case 117: + if (m.data)[(m.p)] == 45 { + goto tr165 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr166 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr166 + } + default: + goto tr166 + } + goto tr106 + case 118: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr167 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr167 + } + default: + goto tr167 + } + goto tr106 + case 119: + if (m.data)[(m.p)] == 58 { + goto tr168 + } + goto tr106 + case 120: + switch (m.data)[(m.p)] { + case 33: + goto tr170 + case 37: + goto tr171 + case 61: + goto tr170 + case 95: + goto tr170 + case 126: + goto tr170 + } + switch { + case (m.data)[(m.p)] < 48: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr170 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr170 + } + case (m.data)[(m.p)] >= 64: + goto tr170 + } + default: + goto tr170 + } + goto tr169 + case 177: + switch (m.data)[(m.p)] { + case 33: + goto tr218 + case 35: + goto tr219 + case 37: + goto tr220 + case 61: + goto tr218 + case 63: + goto tr221 + case 95: + goto tr218 + case 126: + goto tr218 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr218 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr218 + } + default: + goto tr218 + } + goto tr169 + case 178: + switch (m.data)[(m.p)] { + case 33: + goto tr222 + case 37: + goto tr223 + case 61: + goto tr222 + case 95: + goto tr222 + case 126: + goto tr222 + } + switch { + case (m.data)[(m.p)] < 63: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr222 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr222 + } + default: + goto tr222 + } + goto tr183 + case 179: + switch (m.data)[(m.p)] { + case 33: + goto tr224 + case 37: + goto tr225 + case 61: + goto tr224 + case 95: + goto tr224 + case 126: + goto tr224 + } + switch { + case (m.data)[(m.p)] < 63: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr224 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr224 + } + default: + goto tr224 + } + goto tr183 + case 121: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr173 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr173 + } + default: + goto tr174 + } + goto tr172 + case 122: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr175 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr175 + } + default: + goto tr176 + } + goto tr172 + case 180: + switch (m.data)[(m.p)] { + case 33: + goto tr224 + case 37: + goto tr225 + case 61: + goto tr224 + case 95: + goto tr224 + case 126: + goto tr224 + } + switch { + case (m.data)[(m.p)] < 63: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr224 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr224 + } + default: + goto tr224 + } + goto tr172 + case 123: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr178 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr178 + } + default: + goto tr179 + } + goto tr177 + case 124: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr180 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr180 + } + default: + goto tr181 + } + goto tr177 + case 181: + switch (m.data)[(m.p)] { + case 33: + goto tr218 + case 35: + goto tr219 + case 37: + goto tr220 + case 61: + goto tr218 + case 63: + goto tr221 + case 95: + goto tr218 + case 126: + goto tr218 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr218 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr218 + } + default: + goto tr218 + } + goto tr177 + case 125: + switch (m.data)[(m.p)] { + case 43: + goto tr182 + case 61: + goto tr184 + } + goto tr183 + case 126: + switch (m.data)[(m.p)] { + case 33: + goto tr186 + case 37: + goto tr187 + case 61: + goto tr186 + case 63: + goto tr188 + case 95: + goto tr186 + case 126: + goto tr186 + } + switch { + case (m.data)[(m.p)] < 48: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr186 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr186 + } + case (m.data)[(m.p)] >= 64: + goto tr186 + } + default: + goto tr186 + } + goto tr185 + case 182: + switch (m.data)[(m.p)] { + case 33: + goto tr226 + case 35: + goto tr227 + case 37: + goto tr228 + case 61: + goto tr226 + case 63: + goto tr229 + case 95: + goto tr226 + case 126: + goto tr226 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr226 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr226 + } + default: + goto tr226 + } + goto tr185 + case 127: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr190 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr190 + } + default: + goto tr191 + } + goto tr189 + case 128: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr192 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr192 + } + default: + goto tr193 + } + goto tr189 + case 183: + switch (m.data)[(m.p)] { + case 33: + goto tr226 + case 35: + goto tr227 + case 37: + goto tr228 + case 61: + goto tr226 + case 63: + goto tr229 + case 95: + goto tr226 + case 126: + goto tr226 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr226 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr226 + } + default: + goto tr226 + } + goto tr189 + case 184: + switch (m.data)[(m.p)] { + case 33: + goto tr226 + case 35: + goto tr227 + case 37: + goto tr228 + case 43: + goto tr230 + case 61: + goto tr231 + case 63: + goto tr229 + case 95: + goto tr226 + case 126: + goto tr226 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr226 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr226 + } + default: + goto tr226 + } + goto tr185 + case 185: + switch (m.data)[(m.p)] { + case 33: + goto tr232 + case 35: + goto tr233 + case 37: + goto tr234 + case 47: + goto tr226 + case 61: + goto tr232 + case 63: + goto tr235 + case 95: + goto tr232 + case 126: + goto tr232 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr232 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr232 + } + default: + goto tr232 + } + goto tr185 + case 186: + switch (m.data)[(m.p)] { + case 33: + goto tr204 + case 35: + goto tr227 + case 37: + goto tr237 + case 47: + goto tr226 + case 61: + goto tr204 + case 63: + goto tr229 + case 95: + goto tr204 + case 126: + goto tr204 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr204 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr204 + } + default: + goto tr204 + } + goto tr236 + case 187: + switch (m.data)[(m.p)] { + case 33: + goto tr238 + case 35: + goto tr239 + case 37: + goto tr240 + case 61: + goto tr238 + case 63: + goto tr241 + case 95: + goto tr238 + case 126: + goto tr238 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr238 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr238 + } + default: + goto tr238 + } + goto tr203 + case 129: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr195 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr195 + } + default: + goto tr196 + } + goto tr194 + case 130: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr197 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr197 + } + default: + goto tr198 + } + goto tr194 + case 188: + switch (m.data)[(m.p)] { + case 33: + goto tr238 + case 35: + goto tr239 + case 37: + goto tr240 + case 61: + goto tr238 + case 63: + goto tr241 + case 95: + goto tr238 + case 126: + goto tr238 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr238 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr238 + } + default: + goto tr238 + } + goto tr194 + case 189: + switch (m.data)[(m.p)] { + case 33: + goto tr238 + case 35: + goto tr239 + case 37: + goto tr240 + case 61: + goto tr242 + case 63: + goto tr241 + case 95: + goto tr238 + case 126: + goto tr238 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr238 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr238 + } + default: + goto tr238 + } + goto tr203 + case 190: + switch (m.data)[(m.p)] { + case 33: + goto tr243 + case 35: + goto tr244 + case 37: + goto tr245 + case 47: + goto tr238 + case 61: + goto tr243 + case 63: + goto tr246 + case 95: + goto tr243 + case 126: + goto tr243 + } + switch { + case (m.data)[(m.p)] < 64: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 59 { + goto tr243 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr243 + } + default: + goto tr243 + } + goto tr203 + case 131: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr200 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr200 + } + default: + goto tr201 + } + goto tr199 + case 132: + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr197 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr197 + } + default: + goto tr198 + } + goto tr199 + case 133: + if (m.data)[(m.p)] == 43 { + goto tr202 + } + goto tr185 + case 191: + switch (m.data)[(m.p)] { + case 33: + goto tr232 + case 35: + goto tr233 + case 37: + goto tr234 + case 61: + goto tr232 + case 63: + goto tr247 + case 95: + goto tr232 + case 126: + goto tr232 + } + switch { + case (m.data)[(m.p)] < 48: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr232 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr232 + } + case (m.data)[(m.p)] >= 64: + goto tr232 + } + default: + goto tr232 + } + goto tr185 + case 134: + switch (m.data)[(m.p)] { + case 43: + goto tr202 + case 61: + goto tr184 + } + goto tr185 + case 135: + switch (m.data)[(m.p)] { + case 33: + goto tr204 + case 37: + goto tr205 + case 61: + goto tr204 + case 63: + goto tr206 + case 95: + goto tr204 + case 126: + goto tr204 + } + switch { + case (m.data)[(m.p)] < 48: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr204 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr204 + } + case (m.data)[(m.p)] >= 64: + goto tr204 + } + default: + goto tr204 + } + goto tr203 + case 136: + if (m.data)[(m.p)] == 61 { + goto tr207 + } + goto tr203 + case 192: + switch (m.data)[(m.p)] { + case 33: + goto tr243 + case 35: + goto tr244 + case 37: + goto tr245 + case 61: + goto tr243 + case 63: + goto tr248 + case 95: + goto tr243 + case 126: + goto tr243 + } + switch { + case (m.data)[(m.p)] < 48: + if 36 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 46 { + goto tr243 + } + case (m.data)[(m.p)] > 59: + switch { + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr243 + } + case (m.data)[(m.p)] >= 64: + goto tr243 + } + default: + goto tr243 + } + goto tr203 + case 137: + if (m.data)[(m.p)] == 58 { + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr167 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr167 + } + default: + goto tr167 + } + goto tr106 + case 138: + switch (m.data)[(m.p)] { + case 45: + goto tr165 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr166 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr166 + } + default: + goto tr166 + } + goto tr106 + case 139: + switch (m.data)[(m.p)] { + case 45: + goto tr163 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr164 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr164 + } + default: + goto tr164 + } + goto tr106 + case 140: + switch (m.data)[(m.p)] { + case 45: + goto tr161 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr162 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr162 + } + default: + goto tr162 + } + goto tr106 + case 141: + switch (m.data)[(m.p)] { + case 45: + goto tr159 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr160 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr160 + } + default: + goto tr160 + } + goto tr106 + case 142: + switch (m.data)[(m.p)] { + case 45: + goto tr157 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr158 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr158 + } + default: + goto tr158 + } + goto tr106 + case 143: + switch (m.data)[(m.p)] { + case 45: + goto tr155 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr156 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr156 + } + default: + goto tr156 + } + goto tr106 + case 144: + switch (m.data)[(m.p)] { + case 45: + goto tr153 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr154 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr154 + } + default: + goto tr154 + } + goto tr106 + case 145: + switch (m.data)[(m.p)] { + case 45: + goto tr151 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr152 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr152 + } + default: + goto tr152 + } + goto tr106 + case 146: + switch (m.data)[(m.p)] { + case 45: + goto tr149 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr150 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr150 + } + default: + goto tr150 + } + goto tr106 + case 147: + switch (m.data)[(m.p)] { + case 45: + goto tr147 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr148 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr148 + } + default: + goto tr148 + } + goto tr106 + case 148: + switch (m.data)[(m.p)] { + case 45: + goto tr145 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr146 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr146 + } + default: + goto tr146 + } + goto tr106 + case 149: + switch (m.data)[(m.p)] { + case 45: + goto tr143 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr144 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr144 + } + default: + goto tr144 + } + goto tr106 + case 150: + switch (m.data)[(m.p)] { + case 45: + goto tr141 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr142 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr142 + } + default: + goto tr142 + } + goto tr106 + case 151: + switch (m.data)[(m.p)] { + case 45: + goto tr139 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr140 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr140 + } + default: + goto tr140 + } + goto tr106 + case 152: + switch (m.data)[(m.p)] { + case 45: + goto tr137 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr138 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr138 + } + default: + goto tr138 + } + goto tr106 + case 153: + switch (m.data)[(m.p)] { + case 45: + goto tr135 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr136 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr136 + } + default: + goto tr136 + } + goto tr106 + case 154: + switch (m.data)[(m.p)] { + case 45: + goto tr133 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr134 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr134 + } + default: + goto tr134 + } + goto tr106 + case 155: + switch (m.data)[(m.p)] { + case 45: + goto tr131 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr132 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr132 + } + default: + goto tr132 + } + goto tr106 + case 156: + switch (m.data)[(m.p)] { + case 45: + goto tr129 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr130 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr130 + } + default: + goto tr130 + } + goto tr106 + case 157: + switch (m.data)[(m.p)] { + case 45: + goto tr127 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr128 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr128 + } + default: + goto tr128 + } + goto tr106 + case 158: + switch (m.data)[(m.p)] { + case 45: + goto tr125 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr126 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr126 + } + default: + goto tr126 + } + goto tr106 + case 159: + switch (m.data)[(m.p)] { + case 45: + goto tr123 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr124 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr124 + } + default: + goto tr124 + } + goto tr106 + case 160: + switch (m.data)[(m.p)] { + case 45: + goto tr121 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr122 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr122 + } + default: + goto tr122 + } + goto tr106 + case 161: + switch (m.data)[(m.p)] { + case 45: + goto tr119 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr120 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr120 + } + default: + goto tr120 + } + goto tr106 + case 162: + switch (m.data)[(m.p)] { + case 45: + goto tr117 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr118 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr118 + } + default: + goto tr118 + } + goto tr106 + case 163: + switch (m.data)[(m.p)] { + case 45: + goto tr115 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr116 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr116 + } + default: + goto tr116 + } + goto tr106 + case 164: + switch (m.data)[(m.p)] { + case 45: + goto tr113 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr114 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr114 + } + default: + goto tr114 + } + goto tr106 + case 165: + switch (m.data)[(m.p)] { + case 45: + goto tr111 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr112 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr112 + } + default: + goto tr112 + } + goto tr106 + case 166: + switch (m.data)[(m.p)] { + case 45: + goto tr109 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr110 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr110 + } + default: + goto tr110 + } + goto tr106 + case 167: + switch (m.data)[(m.p)] { + case 45: + goto tr107 + case 82: + goto tr208 + case 114: + goto tr208 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr108 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr108 + } + default: + goto tr108 + } + goto tr103 + case 168: + switch (m.data)[(m.p)] { + case 45: + goto tr109 + case 58: + goto tr168 + case 78: + goto tr209 + case 110: + goto tr209 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr110 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr110 + } + default: + goto tr110 + } + goto tr103 + case 169: + switch (m.data)[(m.p)] { + case 45: + goto tr210 + case 58: + goto tr168 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr112 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr112 + } + default: + goto tr112 + } + goto tr106 + case 170: + switch (m.data)[(m.p)] { + case 45: + goto tr113 + case 48: + goto tr211 + } + switch { + case (m.data)[(m.p)] < 65: + if 49 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr114 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr211 + } + default: + goto tr211 + } + goto tr106 + case 171: + if (m.data)[(m.p)] == 45 { + goto tr115 + } + switch { + case (m.data)[(m.p)] < 65: + if 48 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 57 { + goto tr116 + } + case (m.data)[(m.p)] > 90: + if 97 <= (m.data)[(m.p)] && (m.data)[(m.p)] <= 122 { + goto tr116 + } + default: + goto tr116 + } + goto tr106 + case 193: + switch (m.data)[(m.p)] { + case 10: + goto tr183 + case 13: + goto tr183 + } + goto tr249 + } + + tr183: + m.cs = 0 + goto _again + tr0: + m.cs = 0 + goto f0 + tr5: + m.cs = 0 + goto f3 + tr8: + m.cs = 0 + goto f5 + tr41: + m.cs = 0 + goto f7 + tr44: + m.cs = 0 + goto f8 + tr51: + m.cs = 0 + goto f10 + tr56: + m.cs = 0 + goto f11 + tr74: + m.cs = 0 + goto f13 + tr81: + m.cs = 0 + goto f15 + tr83: + m.cs = 0 + goto f17 + tr86: + m.cs = 0 + goto f19 + tr103: + m.cs = 0 + goto f20 + tr106: + m.cs = 0 + goto f21 + tr169: + m.cs = 0 + goto f22 + tr172: + m.cs = 0 + goto f23 + tr177: + m.cs = 0 + goto f24 + tr185: + m.cs = 0 + goto f25 + tr189: + m.cs = 0 + goto f27 + tr194: + m.cs = 0 + goto f28 + tr199: + m.cs = 0 + goto f29 + tr203: + m.cs = 0 + goto f30 + tr236: + m.cs = 0 + goto f46 + tr1: + m.cs = 2 + goto f1 + tr2: + m.cs = 3 + goto _again + tr3: + m.cs = 4 + goto _again + tr4: + m.cs = 5 + goto f2 + tr6: + m.cs = 6 + goto f4 + tr9: + m.cs = 7 + goto _again + tr11: + m.cs = 8 + goto _again + tr12: + m.cs = 9 + goto _again + tr13: + m.cs = 10 + goto _again + tr14: + m.cs = 11 + goto _again + tr15: + m.cs = 12 + goto _again + tr16: + m.cs = 13 + goto _again + tr17: + m.cs = 14 + goto _again + tr18: + m.cs = 15 + goto _again + tr19: + m.cs = 16 + goto _again + tr20: + m.cs = 17 + goto _again + tr21: + m.cs = 18 + goto _again + tr22: + m.cs = 19 + goto _again + tr23: + m.cs = 20 + goto _again + tr24: + m.cs = 21 + goto _again + tr25: + m.cs = 22 + goto _again + tr26: + m.cs = 23 + goto _again + tr27: + m.cs = 24 + goto _again + tr28: + m.cs = 25 + goto _again + tr29: + m.cs = 26 + goto _again + tr30: + m.cs = 27 + goto _again + tr31: + m.cs = 28 + goto _again + tr32: + m.cs = 29 + goto _again + tr33: + m.cs = 30 + goto _again + tr34: + m.cs = 31 + goto _again + tr35: + m.cs = 32 + goto _again + tr36: + m.cs = 33 + goto _again + tr37: + m.cs = 34 + goto _again + tr38: + m.cs = 35 + goto _again + tr39: + m.cs = 36 + goto _again + tr40: + m.cs = 37 + goto _again + tr10: + m.cs = 38 + goto f6 + tr213: + m.cs = 39 + goto _again + tr43: + m.cs = 39 + goto f4 + tr45: + m.cs = 40 + goto _again + tr46: + m.cs = 40 + goto f9 + tr7: + m.cs = 41 + goto f1 + tr49: + m.cs = 42 + goto _again + tr50: + m.cs = 43 + goto _again + tr52: + m.cs = 45 + goto f1 + tr53: + m.cs = 46 + goto _again + tr54: + m.cs = 47 + goto _again + tr55: + m.cs = 48 + goto f2 + tr57: + m.cs = 49 + goto f4 + tr58: + m.cs = 50 + goto _again + tr59: + m.cs = 51 + goto _again + tr60: + m.cs = 52 + goto _again + tr61: + m.cs = 53 + goto _again + tr62: + m.cs = 54 + goto _again + tr63: + m.cs = 55 + goto _again + tr64: + m.cs = 56 + goto _again + tr65: + m.cs = 57 + goto _again + tr66: + m.cs = 58 + goto _again + tr67: + m.cs = 59 + goto _again + tr68: + m.cs = 60 + goto _again + tr69: + m.cs = 61 + goto _again + tr70: + m.cs = 62 + goto _again + tr71: + m.cs = 63 + goto _again + tr72: + m.cs = 64 + goto _again + tr73: + m.cs = 65 + goto f12 + tr75: + m.cs = 66 + goto f4 + tr78: + m.cs = 67 + goto _again + tr79: + m.cs = 68 + goto _again + tr80: + m.cs = 69 + goto f14 + tr215: + m.cs = 70 + goto f35 + tr217: + m.cs = 71 + goto _again + tr85: + m.cs = 71 + goto f18 + tr87: + m.cs = 72 + goto _again + tr88: + m.cs = 72 + goto f9 + tr76: + m.cs = 73 + goto f4 + tr91: + m.cs = 74 + goto _again + tr92: + m.cs = 75 + goto _again + tr93: + m.cs = 76 + goto _again + tr77: + m.cs = 77 + goto f4 + tr94: + m.cs = 78 + goto _again + tr95: + m.cs = 79 + goto _again + tr96: + m.cs = 80 + goto _again + tr97: + m.cs = 81 + goto _again + tr98: + m.cs = 82 + goto _again + tr99: + m.cs = 84 + goto f1 + tr100: + m.cs = 85 + goto _again + tr101: + m.cs = 86 + goto _again + tr102: + m.cs = 87 + goto f2 + tr104: + m.cs = 88 + goto f4 + tr107: + m.cs = 89 + goto _again + tr109: + m.cs = 90 + goto _again + tr111: + m.cs = 91 + goto _again + tr113: + m.cs = 92 + goto _again + tr115: + m.cs = 93 + goto _again + tr117: + m.cs = 94 + goto _again + tr119: + m.cs = 95 + goto _again + tr121: + m.cs = 96 + goto _again + tr123: + m.cs = 97 + goto _again + tr125: + m.cs = 98 + goto _again + tr127: + m.cs = 99 + goto _again + tr129: + m.cs = 100 + goto _again + tr131: + m.cs = 101 + goto _again + tr133: + m.cs = 102 + goto _again + tr135: + m.cs = 103 + goto _again + tr137: + m.cs = 104 + goto _again + tr139: + m.cs = 105 + goto _again + tr141: + m.cs = 106 + goto _again + tr143: + m.cs = 107 + goto _again + tr145: + m.cs = 108 + goto _again + tr147: + m.cs = 109 + goto _again + tr149: + m.cs = 110 + goto _again + tr151: + m.cs = 111 + goto _again + tr153: + m.cs = 112 + goto _again + tr155: + m.cs = 113 + goto _again + tr157: + m.cs = 114 + goto _again + tr159: + m.cs = 115 + goto _again + tr161: + m.cs = 116 + goto _again + tr163: + m.cs = 117 + goto _again + tr165: + m.cs = 118 + goto _again + tr167: + m.cs = 119 + goto _again + tr168: + m.cs = 120 + goto f6 + tr225: + m.cs = 121 + goto _again + tr223: + m.cs = 121 + goto f4 + tr173: + m.cs = 122 + goto _again + tr174: + m.cs = 122 + goto f9 + tr220: + m.cs = 123 + goto _again + tr171: + m.cs = 123 + goto f4 + tr178: + m.cs = 124 + goto _again + tr179: + m.cs = 124 + goto f9 + tr221: + m.cs = 125 + goto f38 + tr182: + m.cs = 126 + goto _again + tr228: + m.cs = 127 + goto _again + tr187: + m.cs = 127 + goto f26 + tr234: + m.cs = 127 + goto f44 + tr190: + m.cs = 128 + goto _again + tr191: + m.cs = 128 + goto f9 + tr240: + m.cs = 129 + goto _again + tr205: + m.cs = 129 + goto f31 + tr245: + m.cs = 129 + goto f50 + tr195: + m.cs = 130 + goto _again + tr196: + m.cs = 130 + goto f9 + tr237: + m.cs = 131 + goto f31 + tr200: + m.cs = 132 + goto _again + tr201: + m.cs = 132 + goto f9 + tr188: + m.cs = 133 + goto f26 + tr247: + m.cs = 134 + goto f45 + tr184: + m.cs = 135 + goto _again + tr206: + m.cs = 136 + goto f31 + tr248: + m.cs = 136 + goto f50 + tr166: + m.cs = 137 + goto _again + tr164: + m.cs = 138 + goto _again + tr162: + m.cs = 139 + goto _again + tr160: + m.cs = 140 + goto _again + tr158: + m.cs = 141 + goto _again + tr156: + m.cs = 142 + goto _again + tr154: + m.cs = 143 + goto _again + tr152: + m.cs = 144 + goto _again + tr150: + m.cs = 145 + goto _again + tr148: + m.cs = 146 + goto _again + tr146: + m.cs = 147 + goto _again + tr144: + m.cs = 148 + goto _again + tr142: + m.cs = 149 + goto _again + tr140: + m.cs = 150 + goto _again + tr138: + m.cs = 151 + goto _again + tr136: + m.cs = 152 + goto _again + tr134: + m.cs = 153 + goto _again + tr132: + m.cs = 154 + goto _again + tr130: + m.cs = 155 + goto _again + tr128: + m.cs = 156 + goto _again + tr126: + m.cs = 157 + goto _again + tr124: + m.cs = 158 + goto _again + tr122: + m.cs = 159 + goto _again + tr120: + m.cs = 160 + goto _again + tr118: + m.cs = 161 + goto _again + tr116: + m.cs = 162 + goto _again + tr114: + m.cs = 163 + goto _again + tr112: + m.cs = 164 + goto _again + tr110: + m.cs = 165 + goto _again + tr108: + m.cs = 166 + goto _again + tr105: + m.cs = 167 + goto f1 + tr208: + m.cs = 168 + goto _again + tr209: + m.cs = 169 + goto _again + tr210: + m.cs = 170 + goto f2 + tr211: + m.cs = 171 + goto _again + tr212: + m.cs = 172 + goto _again + tr42: + m.cs = 172 + goto f4 + tr47: + m.cs = 173 + goto _again + tr48: + m.cs = 173 + goto f9 + tr214: + m.cs = 174 + goto _again + tr82: + m.cs = 174 + goto f16 + tr216: + m.cs = 175 + goto _again + tr84: + m.cs = 175 + goto f18 + tr89: + m.cs = 176 + goto _again + tr90: + m.cs = 176 + goto f9 + tr218: + m.cs = 177 + goto _again + tr170: + m.cs = 177 + goto f4 + tr219: + m.cs = 178 + goto f38 + tr227: + m.cs = 178 + goto f42 + tr233: + m.cs = 178 + goto f45 + tr239: + m.cs = 178 + goto f48 + tr244: + m.cs = 178 + goto f51 + tr224: + m.cs = 179 + goto _again + tr222: + m.cs = 179 + goto f4 + tr175: + m.cs = 180 + goto _again + tr176: + m.cs = 180 + goto f9 + tr180: + m.cs = 181 + goto _again + tr181: + m.cs = 181 + goto f9 + tr226: + m.cs = 182 + goto _again + tr186: + m.cs = 182 + goto f26 + tr232: + m.cs = 182 + goto f44 + tr192: + m.cs = 183 + goto _again + tr193: + m.cs = 183 + goto f9 + tr229: + m.cs = 184 + goto f42 + tr235: + m.cs = 184 + goto f45 + tr230: + m.cs = 185 + goto _again + tr231: + m.cs = 186 + goto _again + tr238: + m.cs = 187 + goto _again + tr204: + m.cs = 187 + goto f31 + tr243: + m.cs = 187 + goto f50 + tr197: + m.cs = 188 + goto _again + tr198: + m.cs = 188 + goto f9 + tr241: + m.cs = 189 + goto _again + tr246: + m.cs = 189 + goto f50 + tr242: + m.cs = 190 + goto _again + tr202: + m.cs = 191 + goto _again + tr207: + m.cs = 192 + goto _again + tr249: + m.cs = 193 + goto _again + + f4: + + m.pb = m.p + + goto _again + f9: + + // List of positions in the buffer to later lowercase + output.tolower = append(output.tolower, m.p-m.pb) + + goto _again + f2: + + output.prefix = string(m.text()) + + goto _again + f6: + + output.ID = string(m.text()) + + goto _again + f38: + + output.SS = string(m.text()) + // Iterate upper letters lowering them + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] + 32 + } + output.norm = string(m.text()) + // Revert the buffer to the original + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] - 32 + } + + goto _again + f0: + + m.err = fmt.Errorf(errPrefix, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f5: + + m.err = fmt.Errorf(errIdentifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f7: + + m.err = fmt.Errorf(errSpecificString, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f23: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + goto _again + f11: + + m.err = fmt.Errorf(errSCIMNamespace, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f13: + + m.err = fmt.Errorf(errSCIMType, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f15: + + m.err = fmt.Errorf(errSCIMName, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f17: + + if m.p == m.pe { + m.err = fmt.Errorf(errSCIMOtherIncomplete, m.p-1) + } else { + m.err = fmt.Errorf(errSCIMOther, m.p) + } + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f14: + + output.scim.Type = scimschema.TypeFromString(string(m.text())) + + goto _again + f16: + + output.scim.pos = m.p + + goto _again + f35: + + output.scim.Name = string(m.data[output.scim.pos:m.p]) + + goto _again + f18: + + output.scim.pos = m.p + + goto _again + f22: + + m.err = fmt.Errorf(err8141SpecificString, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f21: + + m.err = fmt.Errorf(err8141Identifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f42: + + output.rComponent = string(m.text()) + + goto _again + f48: + + output.qComponent = string(m.text()) + + goto _again + f44: + + if output.rStart { + m.err = fmt.Errorf(err8141RComponentStart, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + output.rStart = true + + goto _again + f50: + + if output.qStart { + m.err = fmt.Errorf(err8141QComponentStart, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + output.qStart = true + + goto _again + f25: + + m.err = fmt.Errorf(err8141MalformedRComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f30: + + m.err = fmt.Errorf(err8141MalformedQComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f1: + + m.pb = m.p + + if m.parsingMode != RFC8141Only { + // Throw an error when: + // - we are entering here matching the the prefix in the namespace identifier part + // - looking ahead (3 chars) we find a colon + if pos := m.p + 3; pos < m.pe && m.data[pos] == 58 && output.prefix != "" { + m.err = fmt.Errorf(errNoUrnWithinID, pos) + (m.p)-- + + m.cs = 193 + goto _again + + } + } + + goto _again + f12: + + output.ID = string(m.text()) + + output.scim = &SCIM{} + + goto _again + f3: + + m.err = fmt.Errorf(errIdentifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(errPrefix, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f10: + + m.err = fmt.Errorf(errIdentifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(errNoUrnWithinID, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f8: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(errSpecificString, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f19: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + if m.p == m.pe { + m.err = fmt.Errorf(errSCIMOtherIncomplete, m.p-1) + } else { + m.err = fmt.Errorf(errSCIMOther, m.p) + } + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f24: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(err8141SpecificString, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f27: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(err8141MalformedRComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f28: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(err8141MalformedQComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f20: + + m.err = fmt.Errorf(err8141Identifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(errPrefix, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f26: + + if output.rStart { + m.err = fmt.Errorf(err8141RComponentStart, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + output.rStart = true + + m.pb = m.p + + goto _again + f45: + + if output.rStart { + m.err = fmt.Errorf(err8141RComponentStart, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + output.rStart = true + + output.rComponent = string(m.text()) + + goto _again + f31: + + if output.qStart { + m.err = fmt.Errorf(err8141QComponentStart, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + output.qStart = true + + m.pb = m.p + + goto _again + f51: + + if output.qStart { + m.err = fmt.Errorf(err8141QComponentStart, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + output.qStart = true + + output.qComponent = string(m.text()) + + goto _again + f46: + + m.err = fmt.Errorf(err8141MalformedRComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(err8141MalformedQComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + f29: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(err8141MalformedRComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(err8141MalformedQComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + goto _again + + _again: + switch _toStateActions[m.cs] { + case 33: + + (m.p)-- + + m.err = fmt.Errorf(err8141InformalID, m.p) + m.cs = 193 + goto _again + } + + if m.cs == 0 { + goto _out + } + if (m.p)++; (m.p) != (m.pe) { + goto _resume + } + _testEof: + { + } + if (m.p) == (m.eof) { + switch _eofActions[m.cs] { + case 1: + + m.err = fmt.Errorf(errPrefix, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 6: + + m.err = fmt.Errorf(errIdentifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 8: + + m.err = fmt.Errorf(errSpecificString, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 24: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + case 12: + + m.err = fmt.Errorf(errSCIMNamespace, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 14: + + m.err = fmt.Errorf(errSCIMType, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 16: + + m.err = fmt.Errorf(errSCIMName, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 18: + + if m.p == m.pe { + m.err = fmt.Errorf(errSCIMOtherIncomplete, m.p-1) + } else { + m.err = fmt.Errorf(errSCIMOther, m.p) + } + (m.p)-- + + m.cs = 193 + goto _again + + case 23: + + m.err = fmt.Errorf(err8141SpecificString, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 22: + + m.err = fmt.Errorf(err8141Identifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 26: + + m.err = fmt.Errorf(err8141MalformedRComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 31: + + m.err = fmt.Errorf(err8141MalformedQComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 34: + + output.SS = string(m.text()) + // Iterate upper letters lowering them + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] + 32 + } + output.norm = string(m.text()) + // Revert the buffer to the original + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] - 32 + } + + output.kind = RFC2141 + + case 38: + + output.SS = string(m.text()) + // Iterate upper letters lowering them + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] + 32 + } + output.norm = string(m.text()) + // Revert the buffer to the original + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] - 32 + } + + output.kind = RFC8141 + + case 4: + + m.err = fmt.Errorf(errIdentifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(errPrefix, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 11: + + m.err = fmt.Errorf(errIdentifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(errNoUrnWithinID, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 9: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(errSpecificString, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 20: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + if m.p == m.pe { + m.err = fmt.Errorf(errSCIMOtherIncomplete, m.p-1) + } else { + m.err = fmt.Errorf(errSCIMOther, m.p) + } + (m.p)-- + + m.cs = 193 + goto _again + + case 25: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(err8141SpecificString, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 28: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(err8141MalformedRComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 29: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(err8141MalformedQComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 21: + + m.err = fmt.Errorf(err8141Identifier, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(errPrefix, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 42: + + output.rComponent = string(m.text()) + + output.kind = RFC8141 + + case 48: + + output.qComponent = string(m.text()) + + output.kind = RFC8141 + + case 41: + + output.fComponent = string(m.text()) + + output.kind = RFC8141 + + case 40: + + m.pb = m.p + + output.fComponent = string(m.text()) + + output.kind = RFC8141 + + case 30: + + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + + m.err = fmt.Errorf(err8141MalformedRComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + m.err = fmt.Errorf(err8141MalformedQComp, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + case 35: + + output.scim.Name = string(m.data[output.scim.pos:m.p]) + + output.SS = string(m.text()) + // Iterate upper letters lowering them + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] + 32 + } + output.norm = string(m.text()) + // Revert the buffer to the original + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] - 32 + } + + output.kind = RFC7643 + + case 37: + + output.scim.Other = string(m.data[output.scim.pos:m.p]) + + output.SS = string(m.text()) + // Iterate upper letters lowering them + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] + 32 + } + output.norm = string(m.text()) + // Revert the buffer to the original + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] - 32 + } + + output.kind = RFC7643 + + case 44: + + if output.rStart { + m.err = fmt.Errorf(err8141RComponentStart, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + output.rStart = true + + output.rComponent = string(m.text()) + + output.kind = RFC8141 + + case 50: + + if output.qStart { + m.err = fmt.Errorf(err8141QComponentStart, m.p) + (m.p)-- + + m.cs = 193 + goto _again + + } + output.qStart = true + + output.qComponent = string(m.text()) + + output.kind = RFC8141 + } + } + + _out: + { + } + } + + if m.cs < firstFinal || m.cs == enFail { + return nil, m.err + } + + return output, nil +} + +func (m *machine) WithParsingMode(x ParsingMode) { + m.parsingMode = x + switch m.parsingMode { + case RFC2141Only: + m.startParsingAt = enMain + case RFC8141Only: + m.startParsingAt = enRfc8141Only + case RFC7643Only: + m.startParsingAt = enScimOnly + } + m.parsingModeSet = true +} diff --git a/vendor/github.com/leodido/go-urn/machine.go.rl b/vendor/github.com/leodido/go-urn/machine.go.rl new file mode 100644 index 00000000..0a174219 --- /dev/null +++ b/vendor/github.com/leodido/go-urn/machine.go.rl @@ -0,0 +1,386 @@ +package urn + +import ( + "fmt" + + scimschema "github.com/leodido/go-urn/scim/schema" +) + +var ( + errPrefix = "expecting the prefix to be the \"urn\" string (whatever case) [col %d]" + errIdentifier = "expecting the identifier to be string (1..31 alnum chars, also containing dashes but not at its beginning) [col %d]" + errSpecificString = "expecting the specific string to be a string containing alnum, hex, or others ([()+,-.:=@;$_!*']) chars [col %d]" + errNoUrnWithinID = "expecting the identifier to not contain the \"urn\" reserved string [col %d]" + errHex = "expecting the percent encoded chars to be well-formed (%%alnum{2}) [col %d]" + errSCIMNamespace = "expecing the SCIM namespace identifier (ietf:params:scim) [col %d]" + errSCIMType = "expecting a correct SCIM type (schemas, api, param) [col %d]" + errSCIMName = "expecting one or more alnum char in the SCIM name part [col %d]" + errSCIMOther = "expecting a well-formed other SCIM part [col %d]" + errSCIMOtherIncomplete = "expecting a not empty SCIM other part after colon [col %d]" + err8141InformalID = "informal URN namespace must be in the form urn-[1-9][0-9] [col %d]" + err8141SpecificString = "expecting the specific string to contain alnum, hex, or others ([~&()+,-.:=@;$_!*'] or [/?] not in first position) chars [col %d]" + err8141Identifier = "expecting the indentifier to be a string with (length 2 to 32 chars) containing alnum (or dashes) not starting or ending with a dash [col %d]" + err8141RComponentStart = "expecting only one r-component (starting with the ?+ sequence) [col %d]" + err8141QComponentStart = "expecting only one q-component (starting with the ?= sequence) [col %d]" + err8141MalformedRComp = "expecting a non-empty r-component containing alnum, hex, or others ([~&()+,-.:=@;$_!*'] or [/?] but not at its beginning) [col %d]" + err8141MalformedQComp = "expecting a non-empty q-component containing alnum, hex, or others ([~&()+,-.:=@;$_!*'] or [/?] but not at its beginning) [col %d]" +) + +%%{ +machine urn; + +# unsigned alphabet +alphtype uint8; + +action mark { + m.pb = m.p +} + +action tolower { + // List of positions in the buffer to later lowercase + output.tolower = append(output.tolower, m.p - m.pb) +} + +action set_pre { + output.prefix = string(m.text()) +} + +action throw_pre_urn_err { + if m.parsingMode != RFC8141Only { + // Throw an error when: + // - we are entering here matching the the prefix in the namespace identifier part + // - looking ahead (3 chars) we find a colon + if pos := m.p + 3; pos < m.pe && m.data[pos] == 58 && output.prefix != "" { + m.err = fmt.Errorf(errNoUrnWithinID, pos) + fhold; + fgoto fail; + } + } +} + +action set_nid { + output.ID = string(m.text()) +} + +action set_nss { + output.SS = string(m.text()) + // Iterate upper letters lowering them + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] + 32 + } + output.norm = string(m.text()) + // Revert the buffer to the original + for _, i := range output.tolower { + m.data[m.pb+i] = m.data[m.pb+i] - 32 + } +} + +action err_pre { + m.err = fmt.Errorf(errPrefix, m.p) + fhold; + fgoto fail; +} + +action err_nid { + m.err = fmt.Errorf(errIdentifier, m.p) + fhold; + fgoto fail; +} + +action err_nss { + m.err = fmt.Errorf(errSpecificString, m.p) + fhold; + fgoto fail; +} + +action err_urn { + m.err = fmt.Errorf(errNoUrnWithinID, m.p) + fhold; + fgoto fail; +} + +action err_hex { + if m.parsingMode == RFC2141Only || m.parsingMode == RFC8141Only { + m.err = fmt.Errorf(errHex, m.p) + fhold; + fgoto fail; + } +} + +action base_type { + output.kind = RFC2141; +} + +pre = ([uU] @err(err_pre) [rR] @err(err_pre) [nN] @err(err_pre)) >mark >throw_pre_urn_err %set_pre; + +nid = (alnum >mark (alnum | '-'){0,31}) $err(err_nid) %set_nid; + +hex = '%' (digit | lower | upper >tolower){2} $err(err_hex); + +sss = (alnum | [()+,\-.:=@;$_!*']); + +nss = (sss | hex)+ $err(err_nss); + +nid_not_urn = (nid - pre %err(err_urn)); + +urn = pre ':' @err(err_pre) (nid_not_urn ':' nss >mark %set_nss) %eof(base_type); + +### SCIM BEG + +action err_scim_nid { + m.err = fmt.Errorf(errSCIMNamespace, m.p) + fhold; + fgoto fail; +} + +action err_scim_type { + m.err = fmt.Errorf(errSCIMType, m.p) + fhold; + fgoto fail; +} + +action err_scim_name { + m.err = fmt.Errorf(errSCIMName, m.p) + fhold; + fgoto fail; +} + +action err_scim_other { + if m.p == m.pe { + m.err = fmt.Errorf(errSCIMOtherIncomplete, m.p-1) + } else { + m.err = fmt.Errorf(errSCIMOther, m.p) + } + fhold; + fgoto fail; +} + +action scim_type { + output.kind = RFC7643; +} + +action create_scim { + output.scim = &SCIM{}; +} + +action set_scim_type { + output.scim.Type = scimschema.TypeFromString(string(m.text())) +} + +action mark_scim_name { + output.scim.pos = m.p +} + +action set_scim_name { + output.scim.Name = string(m.data[output.scim.pos:m.p]) +} + +action mark_scim_other { + output.scim.pos = m.p +} + +action set_scim_other { + output.scim.Other = string(m.data[output.scim.pos:m.p]) +} + +scim_nid = 'ietf:params:scim' >mark %set_nid %create_scim $err(err_scim_nid); + +scim_other = ':' (sss | hex)+ >mark_scim_other %set_scim_other $err(err_scim_other); + +scim_name = (alnum)+ >mark_scim_name %set_scim_name $err(err_scim_name); + +scim_type = ('schemas' | 'api' | 'param') >mark %set_scim_type $err(err_scim_type); + +scim_only := pre ':' @err(err_pre) (scim_nid ':' scim_type ':' scim_name scim_other? %set_nss) %eof(scim_type); + +### SCIM END + +### 8141 BEG + +action err_nss_8141 { + m.err = fmt.Errorf(err8141SpecificString, m.p) + fhold; + fgoto fail; +} + +action err_nid_8141 { + m.err = fmt.Errorf(err8141Identifier, m.p) + fhold; + fgoto fail; +} + +action rfc8141_type { + output.kind = RFC8141; +} + +action set_r_component { + output.rComponent = string(m.text()) +} + +action set_q_component { + output.qComponent = string(m.text()) +} + +action set_f_component { + output.fComponent = string(m.text()) +} + +action informal_nid_match { + fhold; + m.err = fmt.Errorf(err8141InformalID, m.p); + fgoto fail; +} + +action mark_r_start { + if output.rStart { + m.err = fmt.Errorf(err8141RComponentStart, m.p) + fhold; + fgoto fail; + } + output.rStart = true +} + +action mark_q_start { + if output.qStart { + m.err = fmt.Errorf(err8141QComponentStart, m.p) + fhold; + fgoto fail; + } + output.qStart = true +} + +action err_malformed_r_component { + m.err = fmt.Errorf(err8141MalformedRComp, m.p) + fhold; + fgoto fail; +} + +action err_malformed_q_component { + m.err = fmt.Errorf(err8141MalformedQComp, m.p) + fhold; + fgoto fail; +} + +pchar = (sss | '~' | '&' | hex); + +component = pchar (pchar | '/' | '?')*; + +r_start = ('?+') %mark_r_start; + +r_component = r_start <: (r_start | component)+ $err(err_malformed_r_component) >mark %set_r_component; + +q_start = ('?=') %mark_q_start; + +q_component = q_start <: (q_start | component)+ $err(err_malformed_q_component) >mark %set_q_component; + +rq_components = (r_component :>> q_component? | q_component); + +fragment = (pchar | '/' | '?')*; + +f_component = '#' fragment >mark %set_f_component; + +nss_rfc8141 = (pchar >mark (pchar | '/')*) $err(err_nss_8141) %set_nss; + +nid_rfc8141 = (alnum >mark (alnum | '-'){0,30} alnum) $err(err_nid_8141) %set_nid; + +informal_id = pre ('-' [a-zA-z0] %to(informal_nid_match)); + +nid_rfc8141_not_urn = (nid_rfc8141 - informal_id?); + +rfc8141_only := pre ':' @err(err_pre) nid_rfc8141_not_urn ':' nss_rfc8141 rq_components? f_component? %eof(rfc8141_type); + +### 8141 END + +fail := (any - [\n\r])* @err{ fgoto main; }; + +main := urn; + +}%% + +%% write data noerror noprefix; + +// Machine is the interface representing the FSM +type Machine interface { + Error() error + Parse(input []byte) (*URN, error) + WithParsingMode(ParsingMode) +} + +type machine struct { + data []byte + cs int + p, pe, eof, pb int + err error + startParsingAt int + parsingMode ParsingMode + parsingModeSet bool +} + +// NewMachine creates a new FSM able to parse RFC 2141 strings. +func NewMachine(options ...Option) Machine { + m := &machine{ + parsingModeSet: false, + } + + for _, o := range options { + o(m) + } + // Set default parsing mode + if !m.parsingModeSet { + m.WithParsingMode(DefaultParsingMode) + } + + %% access m.; + %% variable p m.p; + %% variable pe m.pe; + %% variable eof m.eof; + %% variable data m.data; + + return m +} + +// Err returns the error that occurred on the last call to Parse. +// +// If the result is nil, then the line was parsed successfully. +func (m *machine) Error() error { + return m.err +} + +func (m *machine) text() []byte { + return m.data[m.pb:m.p] +} + +// Parse parses the input byte array as a RFC 2141 or RFC7643 string. +func (m *machine) Parse(input []byte) (*URN, error) { + m.data = input + m.p = 0 + m.pb = 0 + m.pe = len(input) + m.eof = len(input) + m.err = nil + m.cs = m.startParsingAt + output := &URN{ + tolower: []int{}, + } + + %% write exec; + + if m.cs < first_final || m.cs == en_fail { + return nil, m.err + } + + return output, nil +} + +func (m *machine) WithParsingMode(x ParsingMode) { + m.parsingMode = x + switch m.parsingMode { + case RFC2141Only: + m.startParsingAt = en_main + case RFC8141Only: + m.startParsingAt = en_rfc8141_only + case RFC7643Only: + m.startParsingAt = en_scim_only + } + m.parsingModeSet = true +} \ No newline at end of file diff --git a/vendor/github.com/leodido/go-urn/makefile b/vendor/github.com/leodido/go-urn/makefile new file mode 100644 index 00000000..68d5dd0f --- /dev/null +++ b/vendor/github.com/leodido/go-urn/makefile @@ -0,0 +1,51 @@ +SHELL := /bin/bash +RAGEL := ragel +GOFMT := go fmt + +export GO_TEST=env GOTRACEBACK=all go test $(GO_ARGS) + +.PHONY: build +build: machine.go + +.PHONY: clean +clean: + @rm -rf docs + @rm -f machine.go + +.PHONY: images +images: docs/urn.png + +.PHONY: snake2camel +snake2camel: + @cd ./tools/snake2camel; go build -o ../../snake2camel . + +.PHONY: removecomments +removecomments: + @cd ./tools/removecomments; go build -o ../../removecomments . + +machine.go: machine.go.rl + +machine.go: snake2camel + +machine.go: removecomments + +machine.go: + $(RAGEL) -Z -G1 -e -o $@ $< + @./removecomments $@ + @./snake2camel $@ + $(GOFMT) $@ + +docs/urn.dot: machine.go.rl + @mkdir -p docs + $(RAGEL) -Z -e -Vp $< -o $@ + +docs/urn.png: docs/urn.dot + dot $< -Tpng -o $@ + +.PHONY: bench +bench: *_test.go machine.go + go test -bench=. -benchmem -benchtime=5s ./... + +.PHONY: tests +tests: *_test.go + $(GO_TEST) ./... diff --git a/vendor/github.com/leodido/go-urn/options.go b/vendor/github.com/leodido/go-urn/options.go new file mode 100644 index 00000000..c543835a --- /dev/null +++ b/vendor/github.com/leodido/go-urn/options.go @@ -0,0 +1,9 @@ +package urn + +type Option func(Machine) + +func WithParsingMode(mode ParsingMode) Option { + return func(m Machine) { + m.WithParsingMode(mode) + } +} diff --git a/vendor/github.com/leodido/go-urn/parsing_mode.go b/vendor/github.com/leodido/go-urn/parsing_mode.go new file mode 100644 index 00000000..fce5aadc --- /dev/null +++ b/vendor/github.com/leodido/go-urn/parsing_mode.go @@ -0,0 +1,12 @@ +package urn + +type ParsingMode int + +const ( + Default ParsingMode = iota + RFC2141Only + RFC7643Only + RFC8141Only +) + +const DefaultParsingMode = RFC2141Only diff --git a/vendor/github.com/leodido/go-urn/scim.go b/vendor/github.com/leodido/go-urn/scim.go new file mode 100644 index 00000000..f6b7aefb --- /dev/null +++ b/vendor/github.com/leodido/go-urn/scim.go @@ -0,0 +1,48 @@ +package urn + +import ( + "encoding/json" + "fmt" + + scimschema "github.com/leodido/go-urn/scim/schema" +) + +const errInvalidSCIMURN = "invalid SCIM URN: %s" + +type SCIM struct { + Type scimschema.Type + Name string + Other string + pos int +} + +func (s SCIM) MarshalJSON() ([]byte, error) { + return json.Marshal(s.String()) +} + +func (s *SCIM) UnmarshalJSON(bytes []byte) error { + var str string + if err := json.Unmarshal(bytes, &str); err != nil { + return err + } + // Parse as SCIM + value, ok := Parse([]byte(str), WithParsingMode(RFC7643Only)) + if !ok { + return fmt.Errorf(errInvalidSCIMURN, str) + } + if value.RFC() != RFC7643 { + return fmt.Errorf(errInvalidSCIMURN, str) + } + *s = *value.SCIM() + + return nil +} + +func (s *SCIM) String() string { + ret := fmt.Sprintf("urn:ietf:params:scim:%s:%s", s.Type.String(), s.Name) + if s.Other != "" { + ret += fmt.Sprintf(":%s", s.Other) + } + + return ret +} diff --git a/vendor/github.com/leodido/go-urn/scim/schema/type.go b/vendor/github.com/leodido/go-urn/scim/schema/type.go new file mode 100644 index 00000000..13491823 --- /dev/null +++ b/vendor/github.com/leodido/go-urn/scim/schema/type.go @@ -0,0 +1,36 @@ +package scimschema + +type Type int + +const ( + Unsupported Type = iota + Schemas + API + Param +) + +func (t Type) String() string { + switch t { + case Schemas: + return "schemas" + case API: + return "api" + case Param: + return "param" + } + + return "" +} + +func TypeFromString(input string) Type { + switch input { + case "schemas": + return Schemas + case "api": + return API + case "param": + return Param + } + + return Unsupported +} diff --git a/vendor/github.com/leodido/go-urn/urn.go b/vendor/github.com/leodido/go-urn/urn.go new file mode 100644 index 00000000..894d6258 --- /dev/null +++ b/vendor/github.com/leodido/go-urn/urn.go @@ -0,0 +1,141 @@ +package urn + +import ( + "encoding/json" + "fmt" + "strings" +) + +const errInvalidURN = "invalid URN: %s" + +// URN represents an Uniform Resource Name. +// +// The general form represented is: +// +// urn:: +// +// Details at https://tools.ietf.org/html/rfc2141. +type URN struct { + prefix string // Static prefix. Equal to "urn" when empty. + ID string // Namespace identifier (NID) + SS string // Namespace specific string (NSS) + norm string // Normalized namespace specific string + kind Kind + scim *SCIM + rComponent string // RFC8141 + qComponent string // RFC8141 + fComponent string // RFC8141 + rStart bool // RFC8141 + qStart bool // RFC8141 + tolower []int +} + +// Normalize turns the receiving URN into its norm version. +// +// Which means: lowercase prefix, lowercase namespace identifier, and immutate namespace specific string chars (except tokens which are lowercased). +func (u *URN) Normalize() *URN { + return &URN{ + prefix: "urn", + ID: strings.ToLower(u.ID), + SS: u.norm, + // rComponent: u.rComponent, + // qComponent: u.qComponent, + // fComponent: u.fComponent, + } +} + +// Equal checks the lexical equivalence of the current URN with another one. +func (u *URN) Equal(x *URN) bool { + if x == nil { + return false + } + nu := u.Normalize() + nx := x.Normalize() + + return nu.prefix == nx.prefix && nu.ID == nx.ID && nu.SS == nx.SS +} + +// String reassembles the URN into a valid URN string. +// +// This requires both ID and SS fields to be non-empty. +// Otherwise it returns an empty string. +// +// Default URN prefix is "urn". +func (u *URN) String() string { + var res string + if u.ID != "" && u.SS != "" { + if u.prefix == "" { + res += "urn" + } + res += u.prefix + ":" + u.ID + ":" + u.SS + if u.rComponent != "" { + res += "?+" + u.rComponent + } + if u.qComponent != "" { + res += "?=" + u.qComponent + } + if u.fComponent != "" { + res += "#" + u.fComponent + } + } + + return res +} + +// Parse is responsible to create an URN instance from a byte array matching the correct URN syntax (RFC 2141). +func Parse(u []byte, options ...Option) (*URN, bool) { + urn, err := NewMachine(options...).Parse(u) + if err != nil { + return nil, false + } + + return urn, true +} + +// MarshalJSON marshals the URN to JSON string form (e.g. `"urn:oid:1.2.3.4"`). +func (u URN) MarshalJSON() ([]byte, error) { + return json.Marshal(u.String()) +} + +// UnmarshalJSON unmarshals a URN from JSON string form (e.g. `"urn:oid:1.2.3.4"`). +func (u *URN) UnmarshalJSON(bytes []byte) error { + var str string + if err := json.Unmarshal(bytes, &str); err != nil { + return err + } + if value, ok := Parse([]byte(str)); !ok { + return fmt.Errorf(errInvalidURN, str) + } else { + *u = *value + } + + return nil +} + +func (u *URN) IsSCIM() bool { + return u.kind == RFC7643 +} + +func (u *URN) SCIM() *SCIM { + if u.kind != RFC7643 { + return nil + } + + return u.scim +} + +func (u *URN) RFC() Kind { + return u.kind +} + +func (u *URN) FComponent() string { + return u.fComponent +} + +func (u *URN) QComponent() string { + return u.qComponent +} + +func (u *URN) RComponent() string { + return u.rComponent +} diff --git a/vendor/github.com/leodido/go-urn/urn8141.go b/vendor/github.com/leodido/go-urn/urn8141.go new file mode 100644 index 00000000..da4dd062 --- /dev/null +++ b/vendor/github.com/leodido/go-urn/urn8141.go @@ -0,0 +1,30 @@ +package urn + +import ( + "encoding/json" + "fmt" +) + +const errInvalidURN8141 = "invalid URN per RFC 8141: %s" + +type URN8141 struct { + *URN +} + +func (u URN8141) MarshalJSON() ([]byte, error) { + return json.Marshal(u.String()) +} + +func (u *URN8141) UnmarshalJSON(bytes []byte) error { + var str string + if err := json.Unmarshal(bytes, &str); err != nil { + return err + } + if value, ok := Parse([]byte(str), WithParsingMode(RFC8141Only)); !ok { + return fmt.Errorf(errInvalidURN8141, str) + } else { + *u = URN8141{value} + } + + return nil +} diff --git a/vendor/github.com/lib/pq/array.go b/vendor/github.com/lib/pq/array.go index 9957c048..39c8f7e2 100644 --- a/vendor/github.com/lib/pq/array.go +++ b/vendor/github.com/lib/pq/array.go @@ -19,11 +19,10 @@ var typeSQLScanner = reflect.TypeOf((*sql.Scanner)(nil)).Elem() // slice of any dimension. // // For example: +// db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array([]int{235, 401})) // -// db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array([]int{235, 401})) -// -// var x []sql.NullInt64 -// db.QueryRow(`SELECT ARRAY[235, 401]`).Scan(pq.Array(&x)) +// var x []sql.NullInt64 +// db.QueryRow(`SELECT ARRAY[235, 401]`).Scan(pq.Array(&x)) // // Scanning multi-dimensional arrays is not supported. Arrays where the lower // bound is not one (such as `[0:0]={1}') are not supported. diff --git a/vendor/github.com/lib/pq/doc.go b/vendor/github.com/lib/pq/doc.go index 96309ff8..b5718480 100644 --- a/vendor/github.com/lib/pq/doc.go +++ b/vendor/github.com/lib/pq/doc.go @@ -27,7 +27,9 @@ You can also connect to a database using a URL. For example: connStr := "postgres://pqgotest:password@localhost/pqgotest?sslmode=verify-full" db, err := sql.Open("postgres", connStr) -# Connection String Parameters + +Connection String Parameters + Similarly to libpq, when establishing a connection using pq you are expected to supply a connection string containing zero or more parameters. @@ -40,42 +42,42 @@ them in the options parameter. For compatibility with libpq, the following special connection parameters are supported: - - dbname - The name of the database to connect to - - user - The user to sign in as - - password - The user's password - - host - The host to connect to. Values that start with / are for unix - domain sockets. (default is localhost) - - port - The port to bind to. (default is 5432) - - sslmode - Whether or not to use SSL (default is require, this is not - the default for libpq) - - fallback_application_name - An application_name to fall back to if one isn't provided. - - connect_timeout - Maximum wait for connection, in seconds. Zero or - not specified means wait indefinitely. - - sslcert - Cert file location. The file must contain PEM encoded data. - - sslkey - Key file location. The file must contain PEM encoded data. - - sslrootcert - The location of the root certificate file. The file - must contain PEM encoded data. + * dbname - The name of the database to connect to + * user - The user to sign in as + * password - The user's password + * host - The host to connect to. Values that start with / are for unix + domain sockets. (default is localhost) + * port - The port to bind to. (default is 5432) + * sslmode - Whether or not to use SSL (default is require, this is not + the default for libpq) + * fallback_application_name - An application_name to fall back to if one isn't provided. + * connect_timeout - Maximum wait for connection, in seconds. Zero or + not specified means wait indefinitely. + * sslcert - Cert file location. The file must contain PEM encoded data. + * sslkey - Key file location. The file must contain PEM encoded data. + * sslrootcert - The location of the root certificate file. The file + must contain PEM encoded data. Valid values for sslmode are: - - disable - No SSL - - require - Always SSL (skip verification) - - verify-ca - Always SSL (verify that the certificate presented by the - server was signed by a trusted CA) - - verify-full - Always SSL (verify that the certification presented by - the server was signed by a trusted CA and the server host name - matches the one in the certificate) + * disable - No SSL + * require - Always SSL (skip verification) + * verify-ca - Always SSL (verify that the certificate presented by the + server was signed by a trusted CA) + * verify-full - Always SSL (verify that the certification presented by + the server was signed by a trusted CA and the server host name + matches the one in the certificate) See http://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING for more information about connection string parameters. Use single quotes for values that contain whitespace: - "user=pqgotest password='with spaces'" + "user=pqgotest password='with spaces'" A backslash will escape the next character in values: - "user=space\ man password='it\'s valid'" + "user=space\ man password='it\'s valid'" Note that the connection parameter client_encoding (which sets the text encoding for the connection) may be set but must be "UTF8", @@ -96,7 +98,9 @@ provided connection parameters. The pgpass mechanism as described in http://www.postgresql.org/docs/current/static/libpq-pgpass.html is supported, but on Windows PGPASSFILE must be specified explicitly. -# Queries + +Queries + database/sql does not dictate any specific format for parameter markers in query strings, and pq uses the Postgres-native ordinal markers, @@ -121,7 +125,9 @@ For more details on RETURNING, see the Postgres documentation: For additional instructions on querying see the documentation for the database/sql package. -# Data Types + +Data Types + Parameters pass through driver.DefaultParameterConverter before they are handled by this package. When the binary_parameters connection option is enabled, @@ -129,27 +135,30 @@ by this package. When the binary_parameters connection option is enabled, This package returns the following types for values from the PostgreSQL backend: - - integer types smallint, integer, and bigint are returned as int64 - - floating-point types real and double precision are returned as float64 - - character types char, varchar, and text are returned as string - - temporal types date, time, timetz, timestamp, and timestamptz are - returned as time.Time - - the boolean type is returned as bool - - the bytea type is returned as []byte + - integer types smallint, integer, and bigint are returned as int64 + - floating-point types real and double precision are returned as float64 + - character types char, varchar, and text are returned as string + - temporal types date, time, timetz, timestamp, and timestamptz are + returned as time.Time + - the boolean type is returned as bool + - the bytea type is returned as []byte All other types are returned directly from the backend as []byte values in text format. -# Errors + +Errors + pq may return errors of type *pq.Error which can be interrogated for error details: - if err, ok := err.(*pq.Error); ok { - fmt.Println("pq error:", err.Code.Name()) - } + if err, ok := err.(*pq.Error); ok { + fmt.Println("pq error:", err.Code.Name()) + } See the pq.Error type for details. -# Bulk imports + +Bulk imports You can perform bulk imports by preparing a statement returned by pq.CopyIn (or pq.CopyInSchema) in an explicit transaction (sql.Tx). The returned statement @@ -197,7 +206,9 @@ Usage example: log.Fatal(err) } -# Notifications + +Notifications + PostgreSQL supports a simple publish/subscribe model over database connections. See http://www.postgresql.org/docs/current/static/sql-notify.html @@ -230,7 +241,9 @@ bytes by the PostgreSQL server. You can find a complete, working example of Listener usage at https://godoc.org/github.com/lib/pq/example/listen. -# Kerberos Support + +Kerberos Support + If you need support for Kerberos authentication, add the following to your main package: @@ -246,10 +259,10 @@ don't have to download unnecessary dependencies. When imported, additional connection string parameters are supported: - - krbsrvname - GSS (Kerberos) service name when constructing the - SPN (default is `postgres`). This will be combined with the host - to form the full SPN: `krbsrvname/host`. - - krbspn - GSS (Kerberos) SPN. This takes priority over - `krbsrvname` if present. + * krbsrvname - GSS (Kerberos) service name when constructing the + SPN (default is `postgres`). This will be combined with the host + to form the full SPN: `krbsrvname/host`. + * krbspn - GSS (Kerberos) SPN. This takes priority over + `krbsrvname` if present. */ package pq diff --git a/vendor/github.com/lib/pq/notify.go b/vendor/github.com/lib/pq/notify.go index 5e68d536..5c421fdb 100644 --- a/vendor/github.com/lib/pq/notify.go +++ b/vendor/github.com/lib/pq/notify.go @@ -330,11 +330,11 @@ func (l *ListenerConn) sendSimpleQuery(q string) (err error) { // ExecSimpleQuery executes a "simple query" (i.e. one with no bindable // parameters) on the connection. The possible return values are: -// 1. "executed" is true; the query was executed to completion on the -// database server. If the query failed, err will be set to the error -// returned by the database, otherwise err will be nil. -// 2. If "executed" is false, the query could not be executed on the remote -// server. err will be non-nil. +// 1) "executed" is true; the query was executed to completion on the +// database server. If the query failed, err will be set to the error +// returned by the database, otherwise err will be nil. +// 2) If "executed" is false, the query could not be executed on the remote +// server. err will be non-nil. // // After a call to ExecSimpleQuery has returned an executed=false value, the // connection has either been closed or will be closed shortly thereafter, and @@ -541,12 +541,12 @@ func (l *Listener) NotificationChannel() <-chan *Notification { // connection can not be re-established. // // Listen will only fail in three conditions: -// 1. The channel is already open. The returned error will be -// ErrChannelAlreadyOpen. -// 2. The query was executed on the remote server, but PostgreSQL returned an -// error message in response to the query. The returned error will be a -// pq.Error containing the information the server supplied. -// 3. Close is called on the Listener before the request could be completed. +// 1) The channel is already open. The returned error will be +// ErrChannelAlreadyOpen. +// 2) The query was executed on the remote server, but PostgreSQL returned an +// error message in response to the query. The returned error will be a +// pq.Error containing the information the server supplied. +// 3) Close is called on the Listener before the request could be completed. // // The channel name is case-sensitive. func (l *Listener) Listen(channel string) error { diff --git a/vendor/github.com/lib/pq/scram/scram.go b/vendor/github.com/lib/pq/scram/scram.go index 0e1ef656..477216b6 100644 --- a/vendor/github.com/lib/pq/scram/scram.go +++ b/vendor/github.com/lib/pq/scram/scram.go @@ -25,6 +25,7 @@ // Package scram implements a SCRAM-{SHA-1,etc} client per RFC5802. // // http://tools.ietf.org/html/rfc5802 +// package scram import ( @@ -42,16 +43,17 @@ import ( // // A Client may be used within a SASL conversation with logic resembling: // -// var in []byte -// var client = scram.NewClient(sha1.New, user, pass) -// for client.Step(in) { -// out := client.Out() -// // send out to server -// in := serverOut -// } -// if client.Err() != nil { -// // auth failed -// } +// var in []byte +// var client = scram.NewClient(sha1.New, user, pass) +// for client.Step(in) { +// out := client.Out() +// // send out to server +// in := serverOut +// } +// if client.Err() != nil { +// // auth failed +// } +// type Client struct { newHash func() hash.Hash @@ -71,7 +73,8 @@ type Client struct { // // For SCRAM-SHA-256, for example, use: // -// client := scram.NewClient(sha256.New, user, pass) +// client := scram.NewClient(sha256.New, user, pass) +// func NewClient(newHash func() hash.Hash, user, pass string) *Client { c := &Client{ newHash: newHash, diff --git a/vendor/github.com/opencontainers/go-digest/digest.go b/vendor/github.com/opencontainers/go-digest/digest.go index 465996ce..518b5e71 100644 --- a/vendor/github.com/opencontainers/go-digest/digest.go +++ b/vendor/github.com/opencontainers/go-digest/digest.go @@ -30,7 +30,7 @@ import ( // // The following is an example of the contents of Digest types: // -// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc +// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc // // This allows to abstract the digest behind this type and work only in those // terms. diff --git a/vendor/github.com/opencontainers/go-digest/doc.go b/vendor/github.com/opencontainers/go-digest/doc.go index e2dd44f4..83d3a936 100644 --- a/vendor/github.com/opencontainers/go-digest/doc.go +++ b/vendor/github.com/opencontainers/go-digest/doc.go @@ -19,16 +19,16 @@ // More importantly, it provides tools and wrappers to work with // hash.Hash-based digests with little effort. // -// # Basics +// Basics // // The format of a digest is simply a string with two parts, dubbed the // "algorithm" and the "digest", separated by a colon: // -// : +// : // // An example of a sha256 digest representation follows: // -// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc +// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc // // The "algorithm" portion defines both the hashing algorithm used to calculate // the digest and the encoding of the resulting digest, which defaults to "hex" @@ -42,7 +42,7 @@ // obtained, comparisons are cheap, quick and simple to express with the // standard equality operator. // -// # Verification +// Verification // // The main benefit of using the Digest type is simple verification against a // given digest. The Verifier interface, modeled after the stdlib hash.Hash @@ -50,7 +50,7 @@ // writing is complete, calling the Verifier.Verified method will indicate // whether or not the stream of bytes matches the target digest. // -// # Missing Features +// Missing Features // // In addition to the above, we intend to add the following features to this // package: @@ -58,4 +58,5 @@ // 1. A Digester type that supports write sink digest calculation. // // 2. Suspend and resume of ongoing digest calculations to support efficient digest verification in the registry. +// package digest diff --git a/vendor/github.com/pashagolub/pgxmock/v3/argument.go b/vendor/github.com/pashagolub/pgxmock/v3/argument.go index 6d846708..37a84a3b 100644 --- a/vendor/github.com/pashagolub/pgxmock/v3/argument.go +++ b/vendor/github.com/pashagolub/pgxmock/v3/argument.go @@ -20,3 +20,4 @@ type anyArgument struct{} func (a anyArgument) Match(_ interface{}) bool { return true } + diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go index 5d90dd4c..161aea25 100644 --- a/vendor/github.com/pkg/errors/errors.go +++ b/vendor/github.com/pkg/errors/errors.go @@ -2,89 +2,89 @@ // // The traditional error handling idiom in Go is roughly akin to // -// if err != nil { -// return err -// } +// if err != nil { +// return err +// } // // which when applied recursively up the call stack results in error reports // without context or debugging information. The errors package allows // programmers to add context to the failure path in their code in a way // that does not destroy the original value of the error. // -// # Adding context to an error +// Adding context to an error // // The errors.Wrap function returns a new error that adds context to the // original error by recording a stack trace at the point Wrap is called, // together with the supplied message. For example // -// _, err := ioutil.ReadAll(r) -// if err != nil { -// return errors.Wrap(err, "read failed") -// } +// _, err := ioutil.ReadAll(r) +// if err != nil { +// return errors.Wrap(err, "read failed") +// } // // If additional control is required, the errors.WithStack and // errors.WithMessage functions destructure errors.Wrap into its component // operations: annotating an error with a stack trace and with a message, // respectively. // -// # Retrieving the cause of an error +// Retrieving the cause of an error // // Using errors.Wrap constructs a stack of errors, adding context to the // preceding error. Depending on the nature of the error it may be necessary // to reverse the operation of errors.Wrap to retrieve the original error // for inspection. Any error value which implements this interface // -// type causer interface { -// Cause() error -// } +// type causer interface { +// Cause() error +// } // // can be inspected by errors.Cause. errors.Cause will recursively retrieve // the topmost error that does not implement causer, which is assumed to be // the original cause. For example: // -// switch err := errors.Cause(err).(type) { -// case *MyError: -// // handle specifically -// default: -// // unknown error -// } +// switch err := errors.Cause(err).(type) { +// case *MyError: +// // handle specifically +// default: +// // unknown error +// } // // Although the causer interface is not exported by this package, it is // considered a part of its stable public interface. // -// # Formatted printing of errors +// Formatted printing of errors // // All error values returned from this package implement fmt.Formatter and can // be formatted by the fmt package. The following verbs are supported: // -// %s print the error. If the error has a Cause it will be -// printed recursively. -// %v see %s -// %+v extended format. Each Frame of the error's StackTrace will -// be printed in detail. +// %s print the error. If the error has a Cause it will be +// printed recursively. +// %v see %s +// %+v extended format. Each Frame of the error's StackTrace will +// be printed in detail. // -// # Retrieving the stack trace of an error or wrapper +// Retrieving the stack trace of an error or wrapper // // New, Errorf, Wrap, and Wrapf record a stack trace at the point they are // invoked. This information can be retrieved with the following interface: // -// type stackTracer interface { -// StackTrace() errors.StackTrace -// } +// type stackTracer interface { +// StackTrace() errors.StackTrace +// } // // The returned errors.StackTrace type is defined as // -// type StackTrace []Frame +// type StackTrace []Frame // // The Frame type represents a call site in the stack trace. Frame supports // the fmt.Formatter interface that can be used for printing information about // the stack trace of this error. For example: // -// if err, ok := err.(stackTracer); ok { -// for _, f := range err.StackTrace() { -// fmt.Printf("%+s:%d\n", f, f) -// } -// } +// if err, ok := err.(stackTracer); ok { +// for _, f := range err.StackTrace() { +// fmt.Printf("%+s:%d\n", f, f) +// } +// } // // Although the stackTracer interface is not exported by this package, it is // considered a part of its stable public interface. @@ -265,9 +265,9 @@ func (w *withMessage) Format(s fmt.State, verb rune) { // An error value has a cause if it implements the following // interface: // -// type causer interface { -// Cause() error -// } +// type causer interface { +// Cause() error +// } // // If the error does not implement Cause, the original error will // be returned. If the error is nil, nil will be returned without further diff --git a/vendor/github.com/pkg/errors/go113.go b/vendor/github.com/pkg/errors/go113.go index 2c83c724..be0d10d0 100644 --- a/vendor/github.com/pkg/errors/go113.go +++ b/vendor/github.com/pkg/errors/go113.go @@ -1,4 +1,3 @@ -//go:build go1.13 // +build go1.13 package errors diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pkg/errors/stack.go index 82784d70..779a8348 100644 --- a/vendor/github.com/pkg/errors/stack.go +++ b/vendor/github.com/pkg/errors/stack.go @@ -51,16 +51,16 @@ func (f Frame) name() string { // Format formats the frame according to the fmt.Formatter interface. // -// %s source file -// %d source line -// %n function name -// %v equivalent to %s:%d +// %s source file +// %d source line +// %n function name +// %v equivalent to %s:%d // // Format accepts flags that alter the printing of some verbs, as follows: // -// %+s function name and path of source file relative to the compile time -// GOPATH separated by \n\t (\n\t) -// %+v equivalent to %+s:%d +// %+s function name and path of source file relative to the compile time +// GOPATH separated by \n\t (\n\t) +// %+v equivalent to %+s:%d func (f Frame) Format(s fmt.State, verb rune) { switch verb { case 's': @@ -98,12 +98,12 @@ type StackTrace []Frame // Format formats the stack of Frames according to the fmt.Formatter interface. // -// %s lists source files for each Frame in the stack -// %v lists the source file and line number for each Frame in the stack +// %s lists source files for each Frame in the stack +// %v lists the source file and line number for each Frame in the stack // // Format accepts flags that alter the printing of some verbs, as follows: // -// %+v Prints filename, function, and line number for each Frame in the stack. +// %+v Prints filename, function, and line number for each Frame in the stack. func (st StackTrace) Format(s fmt.State, verb rune) { switch verb { case 'v': diff --git a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go b/vendor/github.com/pmezard/go-difflib/difflib/difflib.go index 2a73737a..003e99fa 100644 --- a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go +++ b/vendor/github.com/pmezard/go-difflib/difflib/difflib.go @@ -199,15 +199,12 @@ func (m *SequenceMatcher) isBJunk(s string) bool { // If IsJunk is not defined: // // Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where -// -// alo <= i <= i+k <= ahi -// blo <= j <= j+k <= bhi -// +// alo <= i <= i+k <= ahi +// blo <= j <= j+k <= bhi // and for all (i',j',k') meeting those conditions, -// -// k >= k' -// i <= i' -// and if i == i', j <= j' +// k >= k' +// i <= i' +// and if i == i', j <= j' // // In other words, of all maximal matching blocks, return one that // starts earliest in a, and of all those maximal matching blocks that diff --git a/vendor/github.com/sirupsen/logrus/doc.go b/vendor/github.com/sirupsen/logrus/doc.go index 51392be8..da67aba0 100644 --- a/vendor/github.com/sirupsen/logrus/doc.go +++ b/vendor/github.com/sirupsen/logrus/doc.go @@ -1,25 +1,25 @@ /* Package logrus is a structured logger for Go, completely API compatible with the standard library logger. + The simplest way to use Logrus is simply the package-level exported logger: - package main + package main - import ( - log "github.com/sirupsen/logrus" - ) + import ( + log "github.com/sirupsen/logrus" + ) - func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - "number": 1, - "size": 10, - }).Info("A walrus appears") - } + func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + "number": 1, + "size": 10, + }).Info("A walrus appears") + } Output: - - time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10 + time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10 For a full guide visit https://github.com/sirupsen/logrus */ diff --git a/vendor/github.com/sirupsen/logrus/formatter.go b/vendor/github.com/sirupsen/logrus/formatter.go index 8c761551..40888377 100644 --- a/vendor/github.com/sirupsen/logrus/formatter.go +++ b/vendor/github.com/sirupsen/logrus/formatter.go @@ -30,12 +30,12 @@ type Formatter interface { // This is to not silently overwrite `time`, `msg`, `func` and `level` fields when // dumping it. If this code wasn't there doing: // -// logrus.WithField("level", 1).Info("hello") +// logrus.WithField("level", 1).Info("hello") // // Would just silently drop the user provided level. Instead with this code // it'll logged as: // -// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."} +// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."} // // It's not exported because it's still using Data in an opinionated way. It's to // avoid code duplication between the two default formatters. diff --git a/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go index df059412..5ff0aef6 100644 --- a/vendor/github.com/sirupsen/logrus/logger.go +++ b/vendor/github.com/sirupsen/logrus/logger.go @@ -76,12 +76,12 @@ func (mw *MutexWrap) Disable() { // `Out` and `Hooks` directly on the default logger instance. You can also just // instantiate your own: // -// var log = &logrus.Logger{ -// Out: os.Stderr, -// Formatter: new(logrus.TextFormatter), -// Hooks: make(logrus.LevelHooks), -// Level: logrus.DebugLevel, -// } +// var log = &logrus.Logger{ +// Out: os.Stderr, +// Formatter: new(logrus.TextFormatter), +// Hooks: make(logrus.LevelHooks), +// Level: logrus.DebugLevel, +// } // // It's recommended to make this a global instance called `log`. func New() *Logger { @@ -347,9 +347,9 @@ func (logger *Logger) Exit(code int) { logger.ExitFunc(code) } -// When file is opened with appending mode, it's safe to -// write concurrently to a file (within 4k message on Linux). -// In these cases user can choose to disable the lock. +//When file is opened with appending mode, it's safe to +//write concurrently to a file (within 4k message on Linux). +//In these cases user can choose to disable the lock. func (logger *Logger) SetNoLock() { logger.mu.Disable() } diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go index 45de3e2b..2403de98 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go @@ -1,4 +1,3 @@ -//go:build appengine // +build appengine package logrus diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_bsd.go b/vendor/github.com/sirupsen/logrus/terminal_check_bsd.go index e3fa38b7..49978998 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_bsd.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_bsd.go @@ -1,4 +1,3 @@ -//go:build (darwin || dragonfly || freebsd || netbsd || openbsd) && !js // +build darwin dragonfly freebsd netbsd openbsd // +build !js diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_js.go b/vendor/github.com/sirupsen/logrus/terminal_check_js.go index 9e951f1b..ebdae3ec 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_js.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_js.go @@ -1,4 +1,3 @@ -//go:build js // +build js package logrus diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go b/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go index 04232da1..97af92c6 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go @@ -1,4 +1,3 @@ -//go:build js || nacl || plan9 // +build js nacl plan9 package logrus diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go index 1b4a99e3..3293fb3c 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go @@ -1,4 +1,3 @@ -//go:build !appengine && !js && !windows && !nacl && !plan9 // +build !appengine,!js,!windows,!nacl,!plan9 package logrus diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_unix.go b/vendor/github.com/sirupsen/logrus/terminal_check_unix.go index f3154b17..04748b85 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_unix.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_unix.go @@ -1,4 +1,3 @@ -//go:build (linux || aix || zos) && !js // +build linux aix zos // +build !js diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_windows.go b/vendor/github.com/sirupsen/logrus/terminal_check_windows.go index 893c6241..2879eb50 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_windows.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_windows.go @@ -1,4 +1,3 @@ -//go:build !appengine && !js && windows // +build !appengine,!js,windows package logrus diff --git a/vendor/github.com/tidwall/match/match.go b/vendor/github.com/tidwall/match/match.go index d41013a3..11da28f1 100644 --- a/vendor/github.com/tidwall/match/match.go +++ b/vendor/github.com/tidwall/match/match.go @@ -10,15 +10,13 @@ import ( // and '?' matches on any one character. // // pattern: -// -// { term } -// +// { term } // term: +// '*' matches any sequence of non-Separator characters +// '?' matches any single non-Separator character +// c matches character c (c != '*', '?', '\\') +// '\\' c matches character c // -// '*' matches any sequence of non-Separator characters -// '?' matches any single non-Separator character -// c matches character c (c != '*', '?', '\\') -// '\\' c matches character c func Match(str, pattern string) bool { if pattern == "*" { return true diff --git a/vendor/github.com/yusufpapurcu/wmi/wmi.go b/vendor/github.com/yusufpapurcu/wmi/wmi.go index 1b51529d..03f386ed 100644 --- a/vendor/github.com/yusufpapurcu/wmi/wmi.go +++ b/vendor/github.com/yusufpapurcu/wmi/wmi.go @@ -467,7 +467,7 @@ func (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismat Reason: "not a Float64", } } - + default: if f.Kind() == reflect.Slice { switch f.Type().Elem().Kind() { diff --git a/vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go b/vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go index 2d0e1d2f..d7099c35 100644 --- a/vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go +++ b/vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go @@ -42,7 +42,7 @@ const ( // a bit-mask. To extract the bit-field, for example, use an // expression like: // -// (span.flags & SPAN_FLAGS_TRACE_FLAGS_MASK) +// (span.flags & SPAN_FLAGS_TRACE_FLAGS_MASK) // // See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions. // diff --git a/vendor/go.uber.org/atomic/nocmp.go b/vendor/go.uber.org/atomic/nocmp.go index 54b74174..a8201cb4 100644 --- a/vendor/go.uber.org/atomic/nocmp.go +++ b/vendor/go.uber.org/atomic/nocmp.go @@ -23,13 +23,13 @@ package atomic // nocmp is an uncomparable struct. Embed this inside another struct to make // it uncomparable. // -// type Foo struct { -// nocmp -// // ... -// } +// type Foo struct { +// nocmp +// // ... +// } // // This DOES NOT: // -// - Disallow shallow copies of structs -// - Disallow comparison of pointers to uncomparable structs +// - Disallow shallow copies of structs +// - Disallow comparison of pointers to uncomparable structs type nocmp [0]func() diff --git a/vendor/golang.org/x/crypto/sha3/doc.go b/vendor/golang.org/x/crypto/sha3/doc.go new file mode 100644 index 00000000..bbf391fe --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/doc.go @@ -0,0 +1,66 @@ +// Copyright 2014 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 sha3 implements the SHA-3 fixed-output-length hash functions and +// the SHAKE variable-output-length hash functions defined by FIPS-202. +// +// All types in this package also implement [encoding.BinaryMarshaler], +// [encoding.BinaryAppender] and [encoding.BinaryUnmarshaler] to marshal and +// unmarshal the internal state of the hash. +// +// Both types of hash function use the "sponge" construction and the Keccak +// permutation. For a detailed specification see http://keccak.noekeon.org/ +// +// # Guidance +// +// If you aren't sure what function you need, use SHAKE256 with at least 64 +// bytes of output. The SHAKE instances are faster than the SHA3 instances; +// the latter have to allocate memory to conform to the hash.Hash interface. +// +// If you need a secret-key MAC (message authentication code), prepend the +// secret key to the input, hash with SHAKE256 and read at least 32 bytes of +// output. +// +// # Security strengths +// +// The SHA3-x (x equals 224, 256, 384, or 512) functions have a security +// strength against preimage attacks of x bits. Since they only produce "x" +// bits of output, their collision-resistance is only "x/2" bits. +// +// The SHAKE-256 and -128 functions have a generic security strength of 256 and +// 128 bits against all attacks, provided that at least 2x bits of their output +// is used. Requesting more than 64 or 32 bytes of output, respectively, does +// not increase the collision-resistance of the SHAKE functions. +// +// # The sponge construction +// +// A sponge builds a pseudo-random function from a public pseudo-random +// permutation, by applying the permutation to a state of "rate + capacity" +// bytes, but hiding "capacity" of the bytes. +// +// A sponge starts out with a zero state. To hash an input using a sponge, up +// to "rate" bytes of the input are XORed into the sponge's state. The sponge +// is then "full" and the permutation is applied to "empty" it. This process is +// repeated until all the input has been "absorbed". The input is then padded. +// The digest is "squeezed" from the sponge in the same way, except that output +// is copied out instead of input being XORed in. +// +// A sponge is parameterized by its generic security strength, which is equal +// to half its capacity; capacity + rate is equal to the permutation's width. +// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means +// that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. +// +// # Recommendations +// +// The SHAKE functions are recommended for most new uses. They can produce +// output of arbitrary length. SHAKE256, with an output length of at least +// 64 bytes, provides 256-bit security against all attacks. The Keccak team +// recommends it for most applications upgrading from SHA2-512. (NIST chose a +// much stronger, but much slower, sponge instance for SHA3-512.) +// +// The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. +// They produce output of the same length, with the same security strengths +// against all attacks. This means, in particular, that SHA3-256 only has +// 128-bit collision resistance, because its output length is 32 bytes. +package sha3 diff --git a/vendor/golang.org/x/crypto/sha3/hashes.go b/vendor/golang.org/x/crypto/sha3/hashes.go new file mode 100644 index 00000000..31fffbe0 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/hashes.go @@ -0,0 +1,128 @@ +// Copyright 2014 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 sha3 + +// This file provides functions for creating instances of the SHA-3 +// and SHAKE hash functions, as well as utility functions for hashing +// bytes. + +import ( + "crypto" + "hash" +) + +// New224 creates a new SHA3-224 hash. +// Its generic security strength is 224 bits against preimage attacks, +// and 112 bits against collision attacks. +func New224() hash.Hash { + return new224() +} + +// New256 creates a new SHA3-256 hash. +// Its generic security strength is 256 bits against preimage attacks, +// and 128 bits against collision attacks. +func New256() hash.Hash { + return new256() +} + +// New384 creates a new SHA3-384 hash. +// Its generic security strength is 384 bits against preimage attacks, +// and 192 bits against collision attacks. +func New384() hash.Hash { + return new384() +} + +// New512 creates a new SHA3-512 hash. +// Its generic security strength is 512 bits against preimage attacks, +// and 256 bits against collision attacks. +func New512() hash.Hash { + return new512() +} + +func init() { + crypto.RegisterHash(crypto.SHA3_224, New224) + crypto.RegisterHash(crypto.SHA3_256, New256) + crypto.RegisterHash(crypto.SHA3_384, New384) + crypto.RegisterHash(crypto.SHA3_512, New512) +} + +const ( + dsbyteSHA3 = 0b00000110 + dsbyteKeccak = 0b00000001 + dsbyteShake = 0b00011111 + dsbyteCShake = 0b00000100 + + // rateK[c] is the rate in bytes for Keccak[c] where c is the capacity in + // bits. Given the sponge size is 1600 bits, the rate is 1600 - c bits. + rateK256 = (1600 - 256) / 8 + rateK448 = (1600 - 448) / 8 + rateK512 = (1600 - 512) / 8 + rateK768 = (1600 - 768) / 8 + rateK1024 = (1600 - 1024) / 8 +) + +func new224Generic() *state { + return &state{rate: rateK448, outputLen: 28, dsbyte: dsbyteSHA3} +} + +func new256Generic() *state { + return &state{rate: rateK512, outputLen: 32, dsbyte: dsbyteSHA3} +} + +func new384Generic() *state { + return &state{rate: rateK768, outputLen: 48, dsbyte: dsbyteSHA3} +} + +func new512Generic() *state { + return &state{rate: rateK1024, outputLen: 64, dsbyte: dsbyteSHA3} +} + +// NewLegacyKeccak256 creates a new Keccak-256 hash. +// +// Only use this function if you require compatibility with an existing cryptosystem +// that uses non-standard padding. All other users should use New256 instead. +func NewLegacyKeccak256() hash.Hash { + return &state{rate: rateK512, outputLen: 32, dsbyte: dsbyteKeccak} +} + +// NewLegacyKeccak512 creates a new Keccak-512 hash. +// +// Only use this function if you require compatibility with an existing cryptosystem +// that uses non-standard padding. All other users should use New512 instead. +func NewLegacyKeccak512() hash.Hash { + return &state{rate: rateK1024, outputLen: 64, dsbyte: dsbyteKeccak} +} + +// Sum224 returns the SHA3-224 digest of the data. +func Sum224(data []byte) (digest [28]byte) { + h := New224() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum256 returns the SHA3-256 digest of the data. +func Sum256(data []byte) (digest [32]byte) { + h := New256() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum384 returns the SHA3-384 digest of the data. +func Sum384(data []byte) (digest [48]byte) { + h := New384() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum512 returns the SHA3-512 digest of the data. +func Sum512(data []byte) (digest [64]byte) { + h := New512() + h.Write(data) + h.Sum(digest[:0]) + return +} diff --git a/vendor/golang.org/x/crypto/sha3/hashes_noasm.go b/vendor/golang.org/x/crypto/sha3/hashes_noasm.go new file mode 100644 index 00000000..9d85fb62 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/hashes_noasm.go @@ -0,0 +1,23 @@ +// 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 !gc || purego || !s390x + +package sha3 + +func new224() *state { + return new224Generic() +} + +func new256() *state { + return new256Generic() +} + +func new384() *state { + return new384Generic() +} + +func new512() *state { + return new512Generic() +} diff --git a/vendor/golang.org/x/crypto/sha3/keccakf.go b/vendor/golang.org/x/crypto/sha3/keccakf.go new file mode 100644 index 00000000..ce48b1dd --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/keccakf.go @@ -0,0 +1,414 @@ +// Copyright 2014 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 !amd64 || purego || !gc + +package sha3 + +import "math/bits" + +// rc stores the round constants for use in the ι step. +var rc = [24]uint64{ + 0x0000000000000001, + 0x0000000000008082, + 0x800000000000808A, + 0x8000000080008000, + 0x000000000000808B, + 0x0000000080000001, + 0x8000000080008081, + 0x8000000000008009, + 0x000000000000008A, + 0x0000000000000088, + 0x0000000080008009, + 0x000000008000000A, + 0x000000008000808B, + 0x800000000000008B, + 0x8000000000008089, + 0x8000000000008003, + 0x8000000000008002, + 0x8000000000000080, + 0x000000000000800A, + 0x800000008000000A, + 0x8000000080008081, + 0x8000000000008080, + 0x0000000080000001, + 0x8000000080008008, +} + +// keccakF1600 applies the Keccak permutation to a 1600b-wide +// state represented as a slice of 25 uint64s. +func keccakF1600(a *[25]uint64) { + // Implementation translated from Keccak-inplace.c + // in the keccak reference code. + var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 + + for i := 0; i < 24; i += 4 { + // Combines the 5 steps in each round into 2 steps. + // Unrolls 4 rounds per loop and spreads some steps across rounds. + + // Round 1 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[6] ^ d1 + bc1 = bits.RotateLeft64(t, 44) + t = a[12] ^ d2 + bc2 = bits.RotateLeft64(t, 43) + t = a[18] ^ d3 + bc3 = bits.RotateLeft64(t, 21) + t = a[24] ^ d4 + bc4 = bits.RotateLeft64(t, 14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] + a[6] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc2 = bits.RotateLeft64(t, 3) + t = a[16] ^ d1 + bc3 = bits.RotateLeft64(t, 45) + t = a[22] ^ d2 + bc4 = bits.RotateLeft64(t, 61) + t = a[3] ^ d3 + bc0 = bits.RotateLeft64(t, 28) + t = a[9] ^ d4 + bc1 = bits.RotateLeft64(t, 20) + a[10] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc4 = bits.RotateLeft64(t, 18) + t = a[1] ^ d1 + bc0 = bits.RotateLeft64(t, 1) + t = a[7] ^ d2 + bc1 = bits.RotateLeft64(t, 6) + t = a[13] ^ d3 + bc2 = bits.RotateLeft64(t, 25) + t = a[19] ^ d4 + bc3 = bits.RotateLeft64(t, 8) + a[20] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc1 = bits.RotateLeft64(t, 36) + t = a[11] ^ d1 + bc2 = bits.RotateLeft64(t, 10) + t = a[17] ^ d2 + bc3 = bits.RotateLeft64(t, 15) + t = a[23] ^ d3 + bc4 = bits.RotateLeft64(t, 56) + t = a[4] ^ d4 + bc0 = bits.RotateLeft64(t, 27) + a[5] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc3 = bits.RotateLeft64(t, 41) + t = a[21] ^ d1 + bc4 = bits.RotateLeft64(t, 2) + t = a[2] ^ d2 + bc0 = bits.RotateLeft64(t, 62) + t = a[8] ^ d3 + bc1 = bits.RotateLeft64(t, 55) + t = a[14] ^ d4 + bc2 = bits.RotateLeft64(t, 39) + a[15] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + // Round 2 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[16] ^ d1 + bc1 = bits.RotateLeft64(t, 44) + t = a[7] ^ d2 + bc2 = bits.RotateLeft64(t, 43) + t = a[23] ^ d3 + bc3 = bits.RotateLeft64(t, 21) + t = a[14] ^ d4 + bc4 = bits.RotateLeft64(t, 14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] + a[16] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc2 = bits.RotateLeft64(t, 3) + t = a[11] ^ d1 + bc3 = bits.RotateLeft64(t, 45) + t = a[2] ^ d2 + bc4 = bits.RotateLeft64(t, 61) + t = a[18] ^ d3 + bc0 = bits.RotateLeft64(t, 28) + t = a[9] ^ d4 + bc1 = bits.RotateLeft64(t, 20) + a[20] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc4 = bits.RotateLeft64(t, 18) + t = a[6] ^ d1 + bc0 = bits.RotateLeft64(t, 1) + t = a[22] ^ d2 + bc1 = bits.RotateLeft64(t, 6) + t = a[13] ^ d3 + bc2 = bits.RotateLeft64(t, 25) + t = a[4] ^ d4 + bc3 = bits.RotateLeft64(t, 8) + a[15] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc1 = bits.RotateLeft64(t, 36) + t = a[1] ^ d1 + bc2 = bits.RotateLeft64(t, 10) + t = a[17] ^ d2 + bc3 = bits.RotateLeft64(t, 15) + t = a[8] ^ d3 + bc4 = bits.RotateLeft64(t, 56) + t = a[24] ^ d4 + bc0 = bits.RotateLeft64(t, 27) + a[10] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc3 = bits.RotateLeft64(t, 41) + t = a[21] ^ d1 + bc4 = bits.RotateLeft64(t, 2) + t = a[12] ^ d2 + bc0 = bits.RotateLeft64(t, 62) + t = a[3] ^ d3 + bc1 = bits.RotateLeft64(t, 55) + t = a[19] ^ d4 + bc2 = bits.RotateLeft64(t, 39) + a[5] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + // Round 3 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[11] ^ d1 + bc1 = bits.RotateLeft64(t, 44) + t = a[22] ^ d2 + bc2 = bits.RotateLeft64(t, 43) + t = a[8] ^ d3 + bc3 = bits.RotateLeft64(t, 21) + t = a[19] ^ d4 + bc4 = bits.RotateLeft64(t, 14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] + a[11] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc2 = bits.RotateLeft64(t, 3) + t = a[1] ^ d1 + bc3 = bits.RotateLeft64(t, 45) + t = a[12] ^ d2 + bc4 = bits.RotateLeft64(t, 61) + t = a[23] ^ d3 + bc0 = bits.RotateLeft64(t, 28) + t = a[9] ^ d4 + bc1 = bits.RotateLeft64(t, 20) + a[15] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc4 = bits.RotateLeft64(t, 18) + t = a[16] ^ d1 + bc0 = bits.RotateLeft64(t, 1) + t = a[2] ^ d2 + bc1 = bits.RotateLeft64(t, 6) + t = a[13] ^ d3 + bc2 = bits.RotateLeft64(t, 25) + t = a[24] ^ d4 + bc3 = bits.RotateLeft64(t, 8) + a[5] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc1 = bits.RotateLeft64(t, 36) + t = a[6] ^ d1 + bc2 = bits.RotateLeft64(t, 10) + t = a[17] ^ d2 + bc3 = bits.RotateLeft64(t, 15) + t = a[3] ^ d3 + bc4 = bits.RotateLeft64(t, 56) + t = a[14] ^ d4 + bc0 = bits.RotateLeft64(t, 27) + a[20] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc3 = bits.RotateLeft64(t, 41) + t = a[21] ^ d1 + bc4 = bits.RotateLeft64(t, 2) + t = a[7] ^ d2 + bc0 = bits.RotateLeft64(t, 62) + t = a[18] ^ d3 + bc1 = bits.RotateLeft64(t, 55) + t = a[4] ^ d4 + bc2 = bits.RotateLeft64(t, 39) + a[10] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + // Round 4 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[1] ^ d1 + bc1 = bits.RotateLeft64(t, 44) + t = a[2] ^ d2 + bc2 = bits.RotateLeft64(t, 43) + t = a[3] ^ d3 + bc3 = bits.RotateLeft64(t, 21) + t = a[4] ^ d4 + bc4 = bits.RotateLeft64(t, 14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] + a[1] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc2 = bits.RotateLeft64(t, 3) + t = a[6] ^ d1 + bc3 = bits.RotateLeft64(t, 45) + t = a[7] ^ d2 + bc4 = bits.RotateLeft64(t, 61) + t = a[8] ^ d3 + bc0 = bits.RotateLeft64(t, 28) + t = a[9] ^ d4 + bc1 = bits.RotateLeft64(t, 20) + a[5] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc4 = bits.RotateLeft64(t, 18) + t = a[11] ^ d1 + bc0 = bits.RotateLeft64(t, 1) + t = a[12] ^ d2 + bc1 = bits.RotateLeft64(t, 6) + t = a[13] ^ d3 + bc2 = bits.RotateLeft64(t, 25) + t = a[14] ^ d4 + bc3 = bits.RotateLeft64(t, 8) + a[10] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc1 = bits.RotateLeft64(t, 36) + t = a[16] ^ d1 + bc2 = bits.RotateLeft64(t, 10) + t = a[17] ^ d2 + bc3 = bits.RotateLeft64(t, 15) + t = a[18] ^ d3 + bc4 = bits.RotateLeft64(t, 56) + t = a[19] ^ d4 + bc0 = bits.RotateLeft64(t, 27) + a[15] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc3 = bits.RotateLeft64(t, 41) + t = a[21] ^ d1 + bc4 = bits.RotateLeft64(t, 2) + t = a[22] ^ d2 + bc0 = bits.RotateLeft64(t, 62) + t = a[23] ^ d3 + bc1 = bits.RotateLeft64(t, 55) + t = a[24] ^ d4 + bc2 = bits.RotateLeft64(t, 39) + a[20] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + } +} diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go new file mode 100644 index 00000000..b908696b --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go @@ -0,0 +1,13 @@ +// Copyright 2015 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 amd64 && !purego && gc + +package sha3 + +// This function is implemented in keccakf_amd64.s. + +//go:noescape + +func keccakF1600(a *[25]uint64) diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s new file mode 100644 index 00000000..99e2f16e --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s @@ -0,0 +1,5419 @@ +// Code generated by command: go run keccakf_amd64_asm.go -out ../keccakf_amd64.s -pkg sha3. DO NOT EDIT. + +//go:build amd64 && !purego && gc + +// func keccakF1600(a *[25]uint64) +TEXT ·keccakF1600(SB), $200-8 + MOVQ a+0(FP), DI + + // Convert the user state into an internal state + NOTQ 8(DI) + NOTQ 16(DI) + NOTQ 64(DI) + NOTQ 96(DI) + NOTQ 136(DI) + NOTQ 160(DI) + + // Execute the KeccakF permutation + MOVQ (DI), SI + MOVQ 8(DI), BP + MOVQ 32(DI), R15 + XORQ 40(DI), SI + XORQ 48(DI), BP + XORQ 72(DI), R15 + XORQ 80(DI), SI + XORQ 88(DI), BP + XORQ 112(DI), R15 + XORQ 120(DI), SI + XORQ 128(DI), BP + XORQ 152(DI), R15 + XORQ 160(DI), SI + XORQ 168(DI), BP + MOVQ 176(DI), DX + MOVQ 184(DI), R8 + XORQ 192(DI), R15 + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x0000000000000001, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x0000000000008082, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x800000000000808a, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000080008000, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x000000000000808b, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x0000000080000001, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000080008081, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000000008009, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x000000000000008a, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x0000000000000088, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x0000000080008009, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x000000008000000a, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x000000008000808b, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x800000000000008b, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000000008089, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000000008003, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000000008002, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000000000080, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x000000000000800a, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x800000008000000a, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000080008081, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000000008080, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + MOVQ R12, BP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + XORQ R10, R15 + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + XORQ R11, R15 + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(DI), R12 + XORQ 56(DI), DX + XORQ R15, BX + XORQ 96(DI), R12 + XORQ 136(DI), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(DI), R13 + XORQ 64(DI), R8 + XORQ SI, CX + XORQ 104(DI), R13 + XORQ 144(DI), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (DI), R10 + MOVQ 48(DI), R11 + XORQ R13, R9 + MOVQ 96(DI), R12 + MOVQ 144(DI), R13 + MOVQ 192(DI), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x0000000080000001, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (SP) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(SP) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(SP) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(SP) + MOVQ R12, 8(SP) + MOVQ R12, BP + + // Result g + MOVQ 72(DI), R11 + XORQ R9, R11 + MOVQ 80(DI), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(DI), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(DI), R13 + MOVQ 176(DI), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(SP) + XORQ AX, SI + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(SP) + XORQ AX, BP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(SP) + NOTQ R14 + XORQ R10, R15 + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(SP) + + // Result k + MOVQ 8(DI), R10 + MOVQ 56(DI), R11 + MOVQ 104(DI), R12 + MOVQ 152(DI), R13 + MOVQ 160(DI), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(SP) + XORQ AX, SI + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(SP) + XORQ AX, BP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(SP) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(SP) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(SP) + XORQ R10, R15 + + // Result m + MOVQ 40(DI), R11 + XORQ BX, R11 + MOVQ 88(DI), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(DI), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(DI), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(DI), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(SP) + XORQ AX, SI + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(SP) + XORQ AX, BP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(SP) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(SP) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(SP) + XORQ R11, R15 + + // Result s + MOVQ 16(DI), R10 + MOVQ 64(DI), R11 + MOVQ 112(DI), R12 + XORQ DX, R10 + MOVQ 120(DI), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(DI), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(SP) + ROLQ $0x27, R12 + XORQ R9, R15 + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(SP) + XORQ BX, SI + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(SP) + XORQ CX, BP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(SP) + MOVQ R8, 184(SP) + + // Prepare round + MOVQ BP, BX + ROLQ $0x01, BX + MOVQ 16(SP), R12 + XORQ 56(SP), DX + XORQ R15, BX + XORQ 96(SP), R12 + XORQ 136(SP), DX + XORQ DX, R12 + MOVQ R12, CX + ROLQ $0x01, CX + MOVQ 24(SP), R13 + XORQ 64(SP), R8 + XORQ SI, CX + XORQ 104(SP), R13 + XORQ 144(SP), R8 + XORQ R8, R13 + MOVQ R13, DX + ROLQ $0x01, DX + MOVQ R15, R8 + XORQ BP, DX + ROLQ $0x01, R8 + MOVQ SI, R9 + XORQ R12, R8 + ROLQ $0x01, R9 + + // Result b + MOVQ (SP), R10 + MOVQ 48(SP), R11 + XORQ R13, R9 + MOVQ 96(SP), R12 + MOVQ 144(SP), R13 + MOVQ 192(SP), R14 + XORQ CX, R11 + ROLQ $0x2c, R11 + XORQ DX, R12 + XORQ BX, R10 + ROLQ $0x2b, R12 + MOVQ R11, SI + MOVQ $0x8000000080008008, AX + ORQ R12, SI + XORQ R10, AX + XORQ AX, SI + MOVQ SI, (DI) + XORQ R9, R14 + ROLQ $0x0e, R14 + MOVQ R10, R15 + ANDQ R11, R15 + XORQ R14, R15 + MOVQ R15, 32(DI) + XORQ R8, R13 + ROLQ $0x15, R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 16(DI) + NOTQ R12 + ORQ R10, R14 + ORQ R13, R12 + XORQ R13, R14 + XORQ R11, R12 + MOVQ R14, 24(DI) + MOVQ R12, 8(DI) + NOP + + // Result g + MOVQ 72(SP), R11 + XORQ R9, R11 + MOVQ 80(SP), R12 + ROLQ $0x14, R11 + XORQ BX, R12 + ROLQ $0x03, R12 + MOVQ 24(SP), R10 + MOVQ R11, AX + ORQ R12, AX + XORQ R8, R10 + MOVQ 128(SP), R13 + MOVQ 176(SP), R14 + ROLQ $0x1c, R10 + XORQ R10, AX + MOVQ AX, 40(DI) + NOP + XORQ CX, R13 + ROLQ $0x2d, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 48(DI) + NOP + XORQ DX, R14 + ROLQ $0x3d, R14 + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 64(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 72(DI) + NOTQ R14 + NOP + ORQ R14, R13 + XORQ R12, R13 + MOVQ R13, 56(DI) + + // Result k + MOVQ 8(SP), R10 + MOVQ 56(SP), R11 + MOVQ 104(SP), R12 + MOVQ 152(SP), R13 + MOVQ 160(SP), R14 + XORQ DX, R11 + ROLQ $0x06, R11 + XORQ R8, R12 + ROLQ $0x19, R12 + MOVQ R11, AX + ORQ R12, AX + XORQ CX, R10 + ROLQ $0x01, R10 + XORQ R10, AX + MOVQ AX, 80(DI) + NOP + XORQ R9, R13 + ROLQ $0x08, R13 + MOVQ R12, AX + ANDQ R13, AX + XORQ R11, AX + MOVQ AX, 88(DI) + NOP + XORQ BX, R14 + ROLQ $0x12, R14 + NOTQ R13 + MOVQ R13, AX + ANDQ R14, AX + XORQ R12, AX + MOVQ AX, 96(DI) + MOVQ R14, AX + ORQ R10, AX + XORQ R13, AX + MOVQ AX, 104(DI) + ANDQ R11, R10 + XORQ R14, R10 + MOVQ R10, 112(DI) + NOP + + // Result m + MOVQ 40(SP), R11 + XORQ BX, R11 + MOVQ 88(SP), R12 + ROLQ $0x24, R11 + XORQ CX, R12 + MOVQ 32(SP), R10 + ROLQ $0x0a, R12 + MOVQ R11, AX + MOVQ 136(SP), R13 + ANDQ R12, AX + XORQ R9, R10 + MOVQ 184(SP), R14 + ROLQ $0x1b, R10 + XORQ R10, AX + MOVQ AX, 120(DI) + NOP + XORQ DX, R13 + ROLQ $0x0f, R13 + MOVQ R12, AX + ORQ R13, AX + XORQ R11, AX + MOVQ AX, 128(DI) + NOP + XORQ R8, R14 + ROLQ $0x38, R14 + NOTQ R13 + MOVQ R13, AX + ORQ R14, AX + XORQ R12, AX + MOVQ AX, 136(DI) + ORQ R10, R11 + XORQ R14, R11 + MOVQ R11, 152(DI) + ANDQ R10, R14 + XORQ R13, R14 + MOVQ R14, 144(DI) + NOP + + // Result s + MOVQ 16(SP), R10 + MOVQ 64(SP), R11 + MOVQ 112(SP), R12 + XORQ DX, R10 + MOVQ 120(SP), R13 + ROLQ $0x3e, R10 + XORQ R8, R11 + MOVQ 168(SP), R14 + ROLQ $0x37, R11 + XORQ R9, R12 + MOVQ R10, R9 + XORQ CX, R14 + ROLQ $0x02, R14 + ANDQ R11, R9 + XORQ R14, R9 + MOVQ R9, 192(DI) + ROLQ $0x27, R12 + NOP + NOTQ R11 + XORQ BX, R13 + MOVQ R11, BX + ANDQ R12, BX + XORQ R10, BX + MOVQ BX, 160(DI) + NOP + ROLQ $0x29, R13 + MOVQ R12, CX + ORQ R13, CX + XORQ R11, CX + MOVQ CX, 168(DI) + NOP + MOVQ R13, DX + MOVQ R14, R8 + ANDQ R14, DX + ORQ R10, R8 + XORQ R12, DX + XORQ R13, R8 + MOVQ DX, 176(DI) + MOVQ R8, 184(DI) + + // Revert the internal state to the user state + NOTQ 8(DI) + NOTQ 16(DI) + NOTQ 64(DI) + NOTQ 96(DI) + NOTQ 136(DI) + NOTQ 160(DI) + RET diff --git a/vendor/golang.org/x/crypto/sha3/sha3.go b/vendor/golang.org/x/crypto/sha3/sha3.go new file mode 100644 index 00000000..6658c444 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/sha3.go @@ -0,0 +1,244 @@ +// Copyright 2014 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 sha3 + +import ( + "crypto/subtle" + "encoding/binary" + "errors" + "unsafe" + + "golang.org/x/sys/cpu" +) + +// spongeDirection indicates the direction bytes are flowing through the sponge. +type spongeDirection int + +const ( + // spongeAbsorbing indicates that the sponge is absorbing input. + spongeAbsorbing spongeDirection = iota + // spongeSqueezing indicates that the sponge is being squeezed. + spongeSqueezing +) + +type state struct { + a [1600 / 8]byte // main state of the hash + + // a[n:rate] is the buffer. If absorbing, it's the remaining space to XOR + // into before running the permutation. If squeezing, it's the remaining + // output to produce before running the permutation. + n, rate int + + // dsbyte contains the "domain separation" bits and the first bit of + // the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the + // SHA-3 and SHAKE functions by appending bitstrings to the message. + // Using a little-endian bit-ordering convention, these are "01" for SHA-3 + // and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the + // padding rule from section 5.1 is applied to pad the message to a multiple + // of the rate, which involves adding a "1" bit, zero or more "0" bits, and + // a final "1" bit. We merge the first "1" bit from the padding into dsbyte, + // giving 00000110b (0x06) and 00011111b (0x1f). + // [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf + // "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and + // Extendable-Output Functions (May 2014)" + dsbyte byte + + outputLen int // the default output size in bytes + state spongeDirection // whether the sponge is absorbing or squeezing +} + +// BlockSize returns the rate of sponge underlying this hash function. +func (d *state) BlockSize() int { return d.rate } + +// Size returns the output size of the hash function in bytes. +func (d *state) Size() int { return d.outputLen } + +// Reset clears the internal state by zeroing the sponge state and +// the buffer indexes, and setting Sponge.state to absorbing. +func (d *state) Reset() { + // Zero the permutation's state. + for i := range d.a { + d.a[i] = 0 + } + d.state = spongeAbsorbing + d.n = 0 +} + +func (d *state) clone() *state { + ret := *d + return &ret +} + +// permute applies the KeccakF-1600 permutation. +func (d *state) permute() { + var a *[25]uint64 + if cpu.IsBigEndian { + a = new([25]uint64) + for i := range a { + a[i] = binary.LittleEndian.Uint64(d.a[i*8:]) + } + } else { + a = (*[25]uint64)(unsafe.Pointer(&d.a)) + } + + keccakF1600(a) + d.n = 0 + + if cpu.IsBigEndian { + for i := range a { + binary.LittleEndian.PutUint64(d.a[i*8:], a[i]) + } + } +} + +// pads appends the domain separation bits in dsbyte, applies +// the multi-bitrate 10..1 padding rule, and permutes the state. +func (d *state) padAndPermute() { + // Pad with this instance's domain-separator bits. We know that there's + // at least one byte of space in the sponge because, if it were full, + // permute would have been called to empty it. dsbyte also contains the + // first one bit for the padding. See the comment in the state struct. + d.a[d.n] ^= d.dsbyte + // This adds the final one bit for the padding. Because of the way that + // bits are numbered from the LSB upwards, the final bit is the MSB of + // the last byte. + d.a[d.rate-1] ^= 0x80 + // Apply the permutation + d.permute() + d.state = spongeSqueezing +} + +// Write absorbs more data into the hash's state. It panics if any +// output has already been read. +func (d *state) Write(p []byte) (n int, err error) { + if d.state != spongeAbsorbing { + panic("sha3: Write after Read") + } + + n = len(p) + + for len(p) > 0 { + x := subtle.XORBytes(d.a[d.n:d.rate], d.a[d.n:d.rate], p) + d.n += x + p = p[x:] + + // If the sponge is full, apply the permutation. + if d.n == d.rate { + d.permute() + } + } + + return +} + +// Read squeezes an arbitrary number of bytes from the sponge. +func (d *state) Read(out []byte) (n int, err error) { + // If we're still absorbing, pad and apply the permutation. + if d.state == spongeAbsorbing { + d.padAndPermute() + } + + n = len(out) + + // Now, do the squeezing. + for len(out) > 0 { + // Apply the permutation if we've squeezed the sponge dry. + if d.n == d.rate { + d.permute() + } + + x := copy(out, d.a[d.n:d.rate]) + d.n += x + out = out[x:] + } + + return +} + +// Sum applies padding to the hash state and then squeezes out the desired +// number of output bytes. It panics if any output has already been read. +func (d *state) Sum(in []byte) []byte { + if d.state != spongeAbsorbing { + panic("sha3: Sum after Read") + } + + // Make a copy of the original hash so that caller can keep writing + // and summing. + dup := d.clone() + hash := make([]byte, dup.outputLen, 64) // explicit cap to allow stack allocation + dup.Read(hash) + return append(in, hash...) +} + +const ( + magicSHA3 = "sha\x08" + magicShake = "sha\x09" + magicCShake = "sha\x0a" + magicKeccak = "sha\x0b" + // magic || rate || main state || n || sponge direction + marshaledSize = len(magicSHA3) + 1 + 200 + 1 + 1 +) + +func (d *state) MarshalBinary() ([]byte, error) { + return d.AppendBinary(make([]byte, 0, marshaledSize)) +} + +func (d *state) AppendBinary(b []byte) ([]byte, error) { + switch d.dsbyte { + case dsbyteSHA3: + b = append(b, magicSHA3...) + case dsbyteShake: + b = append(b, magicShake...) + case dsbyteCShake: + b = append(b, magicCShake...) + case dsbyteKeccak: + b = append(b, magicKeccak...) + default: + panic("unknown dsbyte") + } + // rate is at most 168, and n is at most rate. + b = append(b, byte(d.rate)) + b = append(b, d.a[:]...) + b = append(b, byte(d.n), byte(d.state)) + return b, nil +} + +func (d *state) UnmarshalBinary(b []byte) error { + if len(b) != marshaledSize { + return errors.New("sha3: invalid hash state") + } + + magic := string(b[:len(magicSHA3)]) + b = b[len(magicSHA3):] + switch { + case magic == magicSHA3 && d.dsbyte == dsbyteSHA3: + case magic == magicShake && d.dsbyte == dsbyteShake: + case magic == magicCShake && d.dsbyte == dsbyteCShake: + case magic == magicKeccak && d.dsbyte == dsbyteKeccak: + default: + return errors.New("sha3: invalid hash state identifier") + } + + rate := int(b[0]) + b = b[1:] + if rate != d.rate { + return errors.New("sha3: invalid hash state function") + } + + copy(d.a[:], b) + b = b[len(d.a):] + + n, state := int(b[0]), spongeDirection(b[1]) + if n > d.rate { + return errors.New("sha3: invalid hash state") + } + d.n = n + if state != spongeAbsorbing && state != spongeSqueezing { + return errors.New("sha3: invalid hash state") + } + d.state = state + + return nil +} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go new file mode 100644 index 00000000..00d8034a --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go @@ -0,0 +1,303 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego + +package sha3 + +// This file contains code for using the 'compute intermediate +// message digest' (KIMD) and 'compute last message digest' (KLMD) +// instructions to compute SHA-3 and SHAKE hashes on IBM Z. + +import ( + "hash" + + "golang.org/x/sys/cpu" +) + +// codes represent 7-bit KIMD/KLMD function codes as defined in +// the Principles of Operation. +type code uint64 + +const ( + // function codes for KIMD/KLMD + sha3_224 code = 32 + sha3_256 = 33 + sha3_384 = 34 + sha3_512 = 35 + shake_128 = 36 + shake_256 = 37 + nopad = 0x100 +) + +// kimd is a wrapper for the 'compute intermediate message digest' instruction. +// src must be a multiple of the rate for the given function code. +// +//go:noescape +func kimd(function code, chain *[200]byte, src []byte) + +// klmd is a wrapper for the 'compute last message digest' instruction. +// src padding is handled by the instruction. +// +//go:noescape +func klmd(function code, chain *[200]byte, dst, src []byte) + +type asmState struct { + a [200]byte // 1600 bit state + buf []byte // care must be taken to ensure cap(buf) is a multiple of rate + rate int // equivalent to block size + storage [3072]byte // underlying storage for buf + outputLen int // output length for full security + function code // KIMD/KLMD function code + state spongeDirection // whether the sponge is absorbing or squeezing +} + +func newAsmState(function code) *asmState { + var s asmState + s.function = function + switch function { + case sha3_224: + s.rate = 144 + s.outputLen = 28 + case sha3_256: + s.rate = 136 + s.outputLen = 32 + case sha3_384: + s.rate = 104 + s.outputLen = 48 + case sha3_512: + s.rate = 72 + s.outputLen = 64 + case shake_128: + s.rate = 168 + s.outputLen = 32 + case shake_256: + s.rate = 136 + s.outputLen = 64 + default: + panic("sha3: unrecognized function code") + } + + // limit s.buf size to a multiple of s.rate + s.resetBuf() + return &s +} + +func (s *asmState) clone() *asmState { + c := *s + c.buf = c.storage[:len(s.buf):cap(s.buf)] + return &c +} + +// copyIntoBuf copies b into buf. It will panic if there is not enough space to +// store all of b. +func (s *asmState) copyIntoBuf(b []byte) { + bufLen := len(s.buf) + s.buf = s.buf[:len(s.buf)+len(b)] + copy(s.buf[bufLen:], b) +} + +// resetBuf points buf at storage, sets the length to 0 and sets cap to be a +// multiple of the rate. +func (s *asmState) resetBuf() { + max := (cap(s.storage) / s.rate) * s.rate + s.buf = s.storage[:0:max] +} + +// Write (via the embedded io.Writer interface) adds more data to the running hash. +// It never returns an error. +func (s *asmState) Write(b []byte) (int, error) { + if s.state != spongeAbsorbing { + panic("sha3: Write after Read") + } + length := len(b) + for len(b) > 0 { + if len(s.buf) == 0 && len(b) >= cap(s.buf) { + // Hash the data directly and push any remaining bytes + // into the buffer. + remainder := len(b) % s.rate + kimd(s.function, &s.a, b[:len(b)-remainder]) + if remainder != 0 { + s.copyIntoBuf(b[len(b)-remainder:]) + } + return length, nil + } + + if len(s.buf) == cap(s.buf) { + // flush the buffer + kimd(s.function, &s.a, s.buf) + s.buf = s.buf[:0] + } + + // copy as much as we can into the buffer + n := len(b) + if len(b) > cap(s.buf)-len(s.buf) { + n = cap(s.buf) - len(s.buf) + } + s.copyIntoBuf(b[:n]) + b = b[n:] + } + return length, nil +} + +// Read squeezes an arbitrary number of bytes from the sponge. +func (s *asmState) Read(out []byte) (n int, err error) { + // The 'compute last message digest' instruction only stores the digest + // at the first operand (dst) for SHAKE functions. + if s.function != shake_128 && s.function != shake_256 { + panic("sha3: can only call Read for SHAKE functions") + } + + n = len(out) + + // need to pad if we were absorbing + if s.state == spongeAbsorbing { + s.state = spongeSqueezing + + // write hash directly into out if possible + if len(out)%s.rate == 0 { + klmd(s.function, &s.a, out, s.buf) // len(out) may be 0 + s.buf = s.buf[:0] + return + } + + // write hash into buffer + max := cap(s.buf) + if max > len(out) { + max = (len(out)/s.rate)*s.rate + s.rate + } + klmd(s.function, &s.a, s.buf[:max], s.buf) + s.buf = s.buf[:max] + } + + for len(out) > 0 { + // flush the buffer + if len(s.buf) != 0 { + c := copy(out, s.buf) + out = out[c:] + s.buf = s.buf[c:] + continue + } + + // write hash directly into out if possible + if len(out)%s.rate == 0 { + klmd(s.function|nopad, &s.a, out, nil) + return + } + + // write hash into buffer + s.resetBuf() + if cap(s.buf) > len(out) { + s.buf = s.buf[:(len(out)/s.rate)*s.rate+s.rate] + } + klmd(s.function|nopad, &s.a, s.buf, nil) + } + return +} + +// Sum appends the current hash to b and returns the resulting slice. +// It does not change the underlying hash state. +func (s *asmState) Sum(b []byte) []byte { + if s.state != spongeAbsorbing { + panic("sha3: Sum after Read") + } + + // Copy the state to preserve the original. + a := s.a + + // Hash the buffer. Note that we don't clear it because we + // aren't updating the state. + switch s.function { + case sha3_224, sha3_256, sha3_384, sha3_512: + klmd(s.function, &a, nil, s.buf) + return append(b, a[:s.outputLen]...) + case shake_128, shake_256: + d := make([]byte, s.outputLen, 64) + klmd(s.function, &a, d, s.buf) + return append(b, d[:s.outputLen]...) + default: + panic("sha3: unknown function") + } +} + +// Reset resets the Hash to its initial state. +func (s *asmState) Reset() { + for i := range s.a { + s.a[i] = 0 + } + s.resetBuf() + s.state = spongeAbsorbing +} + +// Size returns the number of bytes Sum will return. +func (s *asmState) Size() int { + return s.outputLen +} + +// BlockSize returns the hash's underlying block size. +// The Write method must be able to accept any amount +// of data, but it may operate more efficiently if all writes +// are a multiple of the block size. +func (s *asmState) BlockSize() int { + return s.rate +} + +// Clone returns a copy of the ShakeHash in its current state. +func (s *asmState) Clone() ShakeHash { + return s.clone() +} + +// new224 returns an assembly implementation of SHA3-224 if available, +// otherwise it returns a generic implementation. +func new224() hash.Hash { + if cpu.S390X.HasSHA3 { + return newAsmState(sha3_224) + } + return new224Generic() +} + +// new256 returns an assembly implementation of SHA3-256 if available, +// otherwise it returns a generic implementation. +func new256() hash.Hash { + if cpu.S390X.HasSHA3 { + return newAsmState(sha3_256) + } + return new256Generic() +} + +// new384 returns an assembly implementation of SHA3-384 if available, +// otherwise it returns a generic implementation. +func new384() hash.Hash { + if cpu.S390X.HasSHA3 { + return newAsmState(sha3_384) + } + return new384Generic() +} + +// new512 returns an assembly implementation of SHA3-512 if available, +// otherwise it returns a generic implementation. +func new512() hash.Hash { + if cpu.S390X.HasSHA3 { + return newAsmState(sha3_512) + } + return new512Generic() +} + +// newShake128 returns an assembly implementation of SHAKE-128 if available, +// otherwise it returns a generic implementation. +func newShake128() ShakeHash { + if cpu.S390X.HasSHA3 { + return newAsmState(shake_128) + } + return newShake128Generic() +} + +// newShake256 returns an assembly implementation of SHAKE-256 if available, +// otherwise it returns a generic implementation. +func newShake256() ShakeHash { + if cpu.S390X.HasSHA3 { + return newAsmState(shake_256) + } + return newShake256Generic() +} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.s b/vendor/golang.org/x/crypto/sha3/sha3_s390x.s new file mode 100644 index 00000000..826b862c --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/sha3_s390x.s @@ -0,0 +1,33 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego + +#include "textflag.h" + +// func kimd(function code, chain *[200]byte, src []byte) +TEXT ·kimd(SB), NOFRAME|NOSPLIT, $0-40 + MOVD function+0(FP), R0 + MOVD chain+8(FP), R1 + LMG src+16(FP), R2, R3 // R2=base, R3=len + +continue: + WORD $0xB93E0002 // KIMD --, R2 + BVS continue // continue if interrupted + MOVD $0, R0 // reset R0 for pre-go1.8 compilers + RET + +// func klmd(function code, chain *[200]byte, dst, src []byte) +TEXT ·klmd(SB), NOFRAME|NOSPLIT, $0-64 + // TODO: SHAKE support + MOVD function+0(FP), R0 + MOVD chain+8(FP), R1 + LMG dst+16(FP), R2, R3 // R2=base, R3=len + LMG src+40(FP), R4, R5 // R4=base, R5=len + +continue: + WORD $0xB93F0024 // KLMD R2, R4 + BVS continue // continue if interrupted + MOVD $0, R0 // reset R0 for pre-go1.8 compilers + RET diff --git a/vendor/golang.org/x/crypto/sha3/shake.go b/vendor/golang.org/x/crypto/sha3/shake.go new file mode 100644 index 00000000..a6b3a428 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/shake.go @@ -0,0 +1,193 @@ +// Copyright 2014 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 sha3 + +// This file defines the ShakeHash interface, and provides +// functions for creating SHAKE and cSHAKE instances, as well as utility +// functions for hashing bytes to arbitrary-length output. +// +// +// SHAKE implementation is based on FIPS PUB 202 [1] +// cSHAKE implementations is based on NIST SP 800-185 [2] +// +// [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf +// [2] https://doi.org/10.6028/NIST.SP.800-185 + +import ( + "bytes" + "encoding/binary" + "errors" + "hash" + "io" + "math/bits" +) + +// ShakeHash defines the interface to hash functions that support +// arbitrary-length output. When used as a plain [hash.Hash], it +// produces minimum-length outputs that provide full-strength generic +// security. +type ShakeHash interface { + hash.Hash + + // Read reads more output from the hash; reading affects the hash's + // state. (ShakeHash.Read is thus very different from Hash.Sum) + // It never returns an error, but subsequent calls to Write or Sum + // will panic. + io.Reader + + // Clone returns a copy of the ShakeHash in its current state. + Clone() ShakeHash +} + +// cSHAKE specific context +type cshakeState struct { + *state // SHA-3 state context and Read/Write operations + + // initBlock is the cSHAKE specific initialization set of bytes. It is initialized + // by newCShake function and stores concatenation of N followed by S, encoded + // by the method specified in 3.3 of [1]. + // It is stored here in order for Reset() to be able to put context into + // initial state. + initBlock []byte +} + +func bytepad(data []byte, rate int) []byte { + out := make([]byte, 0, 9+len(data)+rate-1) + out = append(out, leftEncode(uint64(rate))...) + out = append(out, data...) + if padlen := rate - len(out)%rate; padlen < rate { + out = append(out, make([]byte, padlen)...) + } + return out +} + +func leftEncode(x uint64) []byte { + // Let n be the smallest positive integer for which 2^(8n) > x. + n := (bits.Len64(x) + 7) / 8 + if n == 0 { + n = 1 + } + // Return n || x with n as a byte and x an n bytes in big-endian order. + b := make([]byte, 9) + binary.BigEndian.PutUint64(b[1:], x) + b = b[9-n-1:] + b[0] = byte(n) + return b +} + +func newCShake(N, S []byte, rate, outputLen int, dsbyte byte) ShakeHash { + c := cshakeState{state: &state{rate: rate, outputLen: outputLen, dsbyte: dsbyte}} + c.initBlock = make([]byte, 0, 9+len(N)+9+len(S)) // leftEncode returns max 9 bytes + c.initBlock = append(c.initBlock, leftEncode(uint64(len(N))*8)...) + c.initBlock = append(c.initBlock, N...) + c.initBlock = append(c.initBlock, leftEncode(uint64(len(S))*8)...) + c.initBlock = append(c.initBlock, S...) + c.Write(bytepad(c.initBlock, c.rate)) + return &c +} + +// Reset resets the hash to initial state. +func (c *cshakeState) Reset() { + c.state.Reset() + c.Write(bytepad(c.initBlock, c.rate)) +} + +// Clone returns copy of a cSHAKE context within its current state. +func (c *cshakeState) Clone() ShakeHash { + b := make([]byte, len(c.initBlock)) + copy(b, c.initBlock) + return &cshakeState{state: c.clone(), initBlock: b} +} + +// Clone returns copy of SHAKE context within its current state. +func (c *state) Clone() ShakeHash { + return c.clone() +} + +func (c *cshakeState) MarshalBinary() ([]byte, error) { + return c.AppendBinary(make([]byte, 0, marshaledSize+len(c.initBlock))) +} + +func (c *cshakeState) AppendBinary(b []byte) ([]byte, error) { + b, err := c.state.AppendBinary(b) + if err != nil { + return nil, err + } + b = append(b, c.initBlock...) + return b, nil +} + +func (c *cshakeState) UnmarshalBinary(b []byte) error { + if len(b) <= marshaledSize { + return errors.New("sha3: invalid hash state") + } + if err := c.state.UnmarshalBinary(b[:marshaledSize]); err != nil { + return err + } + c.initBlock = bytes.Clone(b[marshaledSize:]) + return nil +} + +// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash. +// Its generic security strength is 128 bits against all attacks if at +// least 32 bytes of its output are used. +func NewShake128() ShakeHash { + return newShake128() +} + +// NewShake256 creates a new SHAKE256 variable-output-length ShakeHash. +// Its generic security strength is 256 bits against all attacks if +// at least 64 bytes of its output are used. +func NewShake256() ShakeHash { + return newShake256() +} + +func newShake128Generic() *state { + return &state{rate: rateK256, outputLen: 32, dsbyte: dsbyteShake} +} + +func newShake256Generic() *state { + return &state{rate: rateK512, outputLen: 64, dsbyte: dsbyteShake} +} + +// NewCShake128 creates a new instance of cSHAKE128 variable-output-length ShakeHash, +// a customizable variant of SHAKE128. +// N is used to define functions based on cSHAKE, it can be empty when plain cSHAKE is +// desired. S is a customization byte string used for domain separation - two cSHAKE +// computations on same input with different S yield unrelated outputs. +// When N and S are both empty, this is equivalent to NewShake128. +func NewCShake128(N, S []byte) ShakeHash { + if len(N) == 0 && len(S) == 0 { + return NewShake128() + } + return newCShake(N, S, rateK256, 32, dsbyteCShake) +} + +// NewCShake256 creates a new instance of cSHAKE256 variable-output-length ShakeHash, +// a customizable variant of SHAKE256. +// N is used to define functions based on cSHAKE, it can be empty when plain cSHAKE is +// desired. S is a customization byte string used for domain separation - two cSHAKE +// computations on same input with different S yield unrelated outputs. +// When N and S are both empty, this is equivalent to NewShake256. +func NewCShake256(N, S []byte) ShakeHash { + if len(N) == 0 && len(S) == 0 { + return NewShake256() + } + return newCShake(N, S, rateK512, 64, dsbyteCShake) +} + +// ShakeSum128 writes an arbitrary-length digest of data into hash. +func ShakeSum128(hash, data []byte) { + h := NewShake128() + h.Write(data) + h.Read(hash) +} + +// ShakeSum256 writes an arbitrary-length digest of data into hash. +func ShakeSum256(hash, data []byte) { + h := NewShake256() + h.Write(data) + h.Read(hash) +} diff --git a/vendor/golang.org/x/crypto/sha3/shake_noasm.go b/vendor/golang.org/x/crypto/sha3/shake_noasm.go new file mode 100644 index 00000000..4276ba4a --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/shake_noasm.go @@ -0,0 +1,15 @@ +// 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 !gc || purego || !s390x + +package sha3 + +func newShake128() *state { + return newShake128Generic() +} + +func newShake256() *state { + return newShake256Generic() +} diff --git a/vendor/golang.org/x/net/html/atom/atom.go b/vendor/golang.org/x/net/html/atom/atom.go new file mode 100644 index 00000000..cd0a8ac1 --- /dev/null +++ b/vendor/golang.org/x/net/html/atom/atom.go @@ -0,0 +1,78 @@ +// Copyright 2012 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 atom provides integer codes (also known as atoms) for a fixed set of +// frequently occurring HTML strings: tag names and attribute keys such as "p" +// and "id". +// +// Sharing an atom's name between all elements with the same tag can result in +// fewer string allocations when tokenizing and parsing HTML. Integer +// comparisons are also generally faster than string comparisons. +// +// The value of an atom's particular code is not guaranteed to stay the same +// between versions of this package. Neither is any ordering guaranteed: +// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to +// be dense. The only guarantees are that e.g. looking up "div" will yield +// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0. +package atom // import "golang.org/x/net/html/atom" + +// Atom is an integer code for a string. The zero value maps to "". +type Atom uint32 + +// String returns the atom's name. +func (a Atom) String() string { + start := uint32(a >> 8) + n := uint32(a & 0xff) + if start+n > uint32(len(atomText)) { + return "" + } + return atomText[start : start+n] +} + +func (a Atom) string() string { + return atomText[a>>8 : a>>8+a&0xff] +} + +// fnv computes the FNV hash with an arbitrary starting value h. +func fnv(h uint32, s []byte) uint32 { + for i := range s { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +func match(s string, t []byte) bool { + for i, c := range t { + if s[i] != c { + return false + } + } + return true +} + +// Lookup returns the atom whose name is s. It returns zero if there is no +// such atom. The lookup is case sensitive. +func Lookup(s []byte) Atom { + if len(s) == 0 || len(s) > maxAtomLen { + return 0 + } + h := fnv(hash0, s) + if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { + return a + } + if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { + return a + } + return 0 +} + +// String returns a string whose contents are equal to s. In that sense, it is +// equivalent to string(s) but may be more efficient. +func String(s []byte) string { + if a := Lookup(s); a != 0 { + return a.String() + } + return string(s) +} diff --git a/vendor/golang.org/x/net/html/atom/table.go b/vendor/golang.org/x/net/html/atom/table.go new file mode 100644 index 00000000..2a938864 --- /dev/null +++ b/vendor/golang.org/x/net/html/atom/table.go @@ -0,0 +1,783 @@ +// Code generated by go generate gen.go; DO NOT EDIT. + +//go:generate go run gen.go + +package atom + +const ( + A Atom = 0x1 + Abbr Atom = 0x4 + Accept Atom = 0x1a06 + AcceptCharset Atom = 0x1a0e + Accesskey Atom = 0x2c09 + Acronym Atom = 0xaa07 + Action Atom = 0x27206 + Address Atom = 0x6f307 + Align Atom = 0xb105 + Allowfullscreen Atom = 0x2080f + Allowpaymentrequest Atom = 0xc113 + Allowusermedia Atom = 0xdd0e + Alt Atom = 0xf303 + Annotation Atom = 0x1c90a + AnnotationXml Atom = 0x1c90e + Applet Atom = 0x31906 + Area Atom = 0x35604 + Article Atom = 0x3fc07 + As Atom = 0x3c02 + Aside Atom = 0x10705 + Async Atom = 0xff05 + Audio Atom = 0x11505 + Autocomplete Atom = 0x2780c + Autofocus Atom = 0x12109 + Autoplay Atom = 0x13c08 + B Atom = 0x101 + Base Atom = 0x3b04 + Basefont Atom = 0x3b08 + Bdi Atom = 0xba03 + Bdo Atom = 0x14b03 + Bgsound Atom = 0x15e07 + Big Atom = 0x17003 + Blink Atom = 0x17305 + Blockquote Atom = 0x1870a + Body Atom = 0x2804 + Br Atom = 0x202 + Button Atom = 0x19106 + Canvas Atom = 0x10306 + Caption Atom = 0x23107 + Center Atom = 0x22006 + Challenge Atom = 0x29b09 + Charset Atom = 0x2107 + Checked Atom = 0x47907 + Cite Atom = 0x19c04 + Class Atom = 0x56405 + Code Atom = 0x5c504 + Col Atom = 0x1ab03 + Colgroup Atom = 0x1ab08 + Color Atom = 0x1bf05 + Cols Atom = 0x1c404 + Colspan Atom = 0x1c407 + Command Atom = 0x1d707 + Content Atom = 0x58b07 + Contenteditable Atom = 0x58b0f + Contextmenu Atom = 0x3800b + Controls Atom = 0x1de08 + Coords Atom = 0x1ea06 + Crossorigin Atom = 0x1fb0b + Data Atom = 0x4a504 + Datalist Atom = 0x4a508 + Datetime Atom = 0x2b808 + Dd Atom = 0x2d702 + Default Atom = 0x10a07 + Defer Atom = 0x5c705 + Del Atom = 0x45203 + Desc Atom = 0x56104 + Details Atom = 0x7207 + Dfn Atom = 0x8703 + Dialog Atom = 0xbb06 + Dir Atom = 0x9303 + Dirname Atom = 0x9307 + Disabled Atom = 0x16408 + Div Atom = 0x16b03 + Dl Atom = 0x5e602 + Download Atom = 0x46308 + Draggable Atom = 0x17a09 + Dropzone Atom = 0x40508 + Dt Atom = 0x64b02 + Em Atom = 0x6e02 + Embed Atom = 0x6e05 + Enctype Atom = 0x28d07 + Face Atom = 0x21e04 + Fieldset Atom = 0x22608 + Figcaption Atom = 0x22e0a + Figure Atom = 0x24806 + Font Atom = 0x3f04 + Footer Atom = 0xf606 + For Atom = 0x25403 + ForeignObject Atom = 0x2540d + Foreignobject Atom = 0x2610d + Form Atom = 0x26e04 + Formaction Atom = 0x26e0a + Formenctype Atom = 0x2890b + Formmethod Atom = 0x2a40a + Formnovalidate Atom = 0x2ae0e + Formtarget Atom = 0x2c00a + Frame Atom = 0x8b05 + Frameset Atom = 0x8b08 + H1 Atom = 0x15c02 + H2 Atom = 0x2de02 + H3 Atom = 0x30d02 + H4 Atom = 0x34502 + H5 Atom = 0x34f02 + H6 Atom = 0x64d02 + Head Atom = 0x33104 + Header Atom = 0x33106 + Headers Atom = 0x33107 + Height Atom = 0x5206 + Hgroup Atom = 0x2ca06 + Hidden Atom = 0x2d506 + High Atom = 0x2db04 + Hr Atom = 0x15702 + Href Atom = 0x2e004 + Hreflang Atom = 0x2e008 + Html Atom = 0x5604 + HttpEquiv Atom = 0x2e80a + I Atom = 0x601 + Icon Atom = 0x58a04 + Id Atom = 0x10902 + Iframe Atom = 0x2fc06 + Image Atom = 0x30205 + Img Atom = 0x30703 + Input Atom = 0x44b05 + Inputmode Atom = 0x44b09 + Ins Atom = 0x20403 + Integrity Atom = 0x23f09 + Is Atom = 0x16502 + Isindex Atom = 0x30f07 + Ismap Atom = 0x31605 + Itemid Atom = 0x38b06 + Itemprop Atom = 0x19d08 + Itemref Atom = 0x3cd07 + Itemscope Atom = 0x67109 + Itemtype Atom = 0x31f08 + Kbd Atom = 0xb903 + Keygen Atom = 0x3206 + Keytype Atom = 0xd607 + Kind Atom = 0x17704 + Label Atom = 0x5905 + Lang Atom = 0x2e404 + Legend Atom = 0x18106 + Li Atom = 0xb202 + Link Atom = 0x17404 + List Atom = 0x4a904 + Listing Atom = 0x4a907 + Loop Atom = 0x5d04 + Low Atom = 0xc303 + Main Atom = 0x1004 + Malignmark Atom = 0xb00a + Manifest Atom = 0x6d708 + Map Atom = 0x31803 + Mark Atom = 0xb604 + Marquee Atom = 0x32707 + Math Atom = 0x32e04 + Max Atom = 0x33d03 + Maxlength Atom = 0x33d09 + Media Atom = 0xe605 + Mediagroup Atom = 0xe60a + Menu Atom = 0x38704 + Menuitem Atom = 0x38708 + Meta Atom = 0x4b804 + Meter Atom = 0x9805 + Method Atom = 0x2a806 + Mglyph Atom = 0x30806 + Mi Atom = 0x34702 + Min Atom = 0x34703 + Minlength Atom = 0x34709 + Mn Atom = 0x2b102 + Mo Atom = 0xa402 + Ms Atom = 0x67402 + Mtext Atom = 0x35105 + Multiple Atom = 0x35f08 + Muted Atom = 0x36705 + Name Atom = 0x9604 + Nav Atom = 0x1303 + Nobr Atom = 0x3704 + Noembed Atom = 0x6c07 + Noframes Atom = 0x8908 + Nomodule Atom = 0xa208 + Nonce Atom = 0x1a605 + Noscript Atom = 0x21608 + Novalidate Atom = 0x2b20a + Object Atom = 0x26806 + Ol Atom = 0x13702 + Onabort Atom = 0x19507 + Onafterprint Atom = 0x2360c + Onautocomplete Atom = 0x2760e + Onautocompleteerror Atom = 0x27613 + Onauxclick Atom = 0x61f0a + Onbeforeprint Atom = 0x69e0d + Onbeforeunload Atom = 0x6e70e + Onblur Atom = 0x56d06 + Oncancel Atom = 0x11908 + Oncanplay Atom = 0x14d09 + Oncanplaythrough Atom = 0x14d10 + Onchange Atom = 0x41b08 + Onclick Atom = 0x2f507 + Onclose Atom = 0x36c07 + Oncontextmenu Atom = 0x37e0d + Oncopy Atom = 0x39106 + Oncuechange Atom = 0x3970b + Oncut Atom = 0x3a205 + Ondblclick Atom = 0x3a70a + Ondrag Atom = 0x3b106 + Ondragend Atom = 0x3b109 + Ondragenter Atom = 0x3ba0b + Ondragexit Atom = 0x3c50a + Ondragleave Atom = 0x3df0b + Ondragover Atom = 0x3ea0a + Ondragstart Atom = 0x3f40b + Ondrop Atom = 0x40306 + Ondurationchange Atom = 0x41310 + Onemptied Atom = 0x40a09 + Onended Atom = 0x42307 + Onerror Atom = 0x42a07 + Onfocus Atom = 0x43107 + Onhashchange Atom = 0x43d0c + Oninput Atom = 0x44907 + Oninvalid Atom = 0x45509 + Onkeydown Atom = 0x45e09 + Onkeypress Atom = 0x46b0a + Onkeyup Atom = 0x48007 + Onlanguagechange Atom = 0x48d10 + Onload Atom = 0x49d06 + Onloadeddata Atom = 0x49d0c + Onloadedmetadata Atom = 0x4b010 + Onloadend Atom = 0x4c609 + Onloadstart Atom = 0x4cf0b + Onmessage Atom = 0x4da09 + Onmessageerror Atom = 0x4da0e + Onmousedown Atom = 0x4e80b + Onmouseenter Atom = 0x4f30c + Onmouseleave Atom = 0x4ff0c + Onmousemove Atom = 0x50b0b + Onmouseout Atom = 0x5160a + Onmouseover Atom = 0x5230b + Onmouseup Atom = 0x52e09 + Onmousewheel Atom = 0x53c0c + Onoffline Atom = 0x54809 + Ononline Atom = 0x55108 + Onpagehide Atom = 0x5590a + Onpageshow Atom = 0x5730a + Onpaste Atom = 0x57f07 + Onpause Atom = 0x59a07 + Onplay Atom = 0x5a406 + Onplaying Atom = 0x5a409 + Onpopstate Atom = 0x5ad0a + Onprogress Atom = 0x5b70a + Onratechange Atom = 0x5cc0c + Onrejectionhandled Atom = 0x5d812 + Onreset Atom = 0x5ea07 + Onresize Atom = 0x5f108 + Onscroll Atom = 0x60008 + Onsecuritypolicyviolation Atom = 0x60819 + Onseeked Atom = 0x62908 + Onseeking Atom = 0x63109 + Onselect Atom = 0x63a08 + Onshow Atom = 0x64406 + Onsort Atom = 0x64f06 + Onstalled Atom = 0x65909 + Onstorage Atom = 0x66209 + Onsubmit Atom = 0x66b08 + Onsuspend Atom = 0x67b09 + Ontimeupdate Atom = 0x400c + Ontoggle Atom = 0x68408 + Onunhandledrejection Atom = 0x68c14 + Onunload Atom = 0x6ab08 + Onvolumechange Atom = 0x6b30e + Onwaiting Atom = 0x6c109 + Onwheel Atom = 0x6ca07 + Open Atom = 0x1a304 + Optgroup Atom = 0x5f08 + Optimum Atom = 0x6d107 + Option Atom = 0x6e306 + Output Atom = 0x51d06 + P Atom = 0xc01 + Param Atom = 0xc05 + Pattern Atom = 0x6607 + Picture Atom = 0x7b07 + Ping Atom = 0xef04 + Placeholder Atom = 0x1310b + Plaintext Atom = 0x1b209 + Playsinline Atom = 0x1400b + Poster Atom = 0x2cf06 + Pre Atom = 0x47003 + Preload Atom = 0x48607 + Progress Atom = 0x5b908 + Prompt Atom = 0x53606 + Public Atom = 0x58606 + Q Atom = 0xcf01 + Radiogroup Atom = 0x30a + Rb Atom = 0x3a02 + Readonly Atom = 0x35708 + Referrerpolicy Atom = 0x3d10e + Rel Atom = 0x48703 + Required Atom = 0x24c08 + Reversed Atom = 0x8008 + Rows Atom = 0x9c04 + Rowspan Atom = 0x9c07 + Rp Atom = 0x23c02 + Rt Atom = 0x19a02 + Rtc Atom = 0x19a03 + Ruby Atom = 0xfb04 + S Atom = 0x2501 + Samp Atom = 0x7804 + Sandbox Atom = 0x12907 + Scope Atom = 0x67505 + Scoped Atom = 0x67506 + Script Atom = 0x21806 + Seamless Atom = 0x37108 + Section Atom = 0x56807 + Select Atom = 0x63c06 + Selected Atom = 0x63c08 + Shape Atom = 0x1e505 + Size Atom = 0x5f504 + Sizes Atom = 0x5f505 + Slot Atom = 0x1ef04 + Small Atom = 0x20605 + Sortable Atom = 0x65108 + Sorted Atom = 0x33706 + Source Atom = 0x37806 + Spacer Atom = 0x43706 + Span Atom = 0x9f04 + Spellcheck Atom = 0x4740a + Src Atom = 0x5c003 + Srcdoc Atom = 0x5c006 + Srclang Atom = 0x5f907 + Srcset Atom = 0x6f906 + Start Atom = 0x3fa05 + Step Atom = 0x58304 + Strike Atom = 0xd206 + Strong Atom = 0x6dd06 + Style Atom = 0x6ff05 + Sub Atom = 0x66d03 + Summary Atom = 0x70407 + Sup Atom = 0x70b03 + Svg Atom = 0x70e03 + System Atom = 0x71106 + Tabindex Atom = 0x4be08 + Table Atom = 0x59505 + Target Atom = 0x2c406 + Tbody Atom = 0x2705 + Td Atom = 0x9202 + Template Atom = 0x71408 + Textarea Atom = 0x35208 + Tfoot Atom = 0xf505 + Th Atom = 0x15602 + Thead Atom = 0x33005 + Time Atom = 0x4204 + Title Atom = 0x11005 + Tr Atom = 0xcc02 + Track Atom = 0x1ba05 + Translate Atom = 0x1f209 + Tt Atom = 0x6802 + Type Atom = 0xd904 + Typemustmatch Atom = 0x2900d + U Atom = 0xb01 + Ul Atom = 0xa702 + Updateviacache Atom = 0x460e + Usemap Atom = 0x59e06 + Value Atom = 0x1505 + Var Atom = 0x16d03 + Video Atom = 0x2f105 + Wbr Atom = 0x57c03 + Width Atom = 0x64905 + Workertype Atom = 0x71c0a + Wrap Atom = 0x72604 + Xmp Atom = 0x12f03 +) + +const hash0 = 0x81cdf10e + +const maxAtomLen = 25 + +var table = [1 << 9]Atom{ + 0x1: 0xe60a, // mediagroup + 0x2: 0x2e404, // lang + 0x4: 0x2c09, // accesskey + 0x5: 0x8b08, // frameset + 0x7: 0x63a08, // onselect + 0x8: 0x71106, // system + 0xa: 0x64905, // width + 0xc: 0x2890b, // formenctype + 0xd: 0x13702, // ol + 0xe: 0x3970b, // oncuechange + 0x10: 0x14b03, // bdo + 0x11: 0x11505, // audio + 0x12: 0x17a09, // draggable + 0x14: 0x2f105, // video + 0x15: 0x2b102, // mn + 0x16: 0x38704, // menu + 0x17: 0x2cf06, // poster + 0x19: 0xf606, // footer + 0x1a: 0x2a806, // method + 0x1b: 0x2b808, // datetime + 0x1c: 0x19507, // onabort + 0x1d: 0x460e, // updateviacache + 0x1e: 0xff05, // async + 0x1f: 0x49d06, // onload + 0x21: 0x11908, // oncancel + 0x22: 0x62908, // onseeked + 0x23: 0x30205, // image + 0x24: 0x5d812, // onrejectionhandled + 0x26: 0x17404, // link + 0x27: 0x51d06, // output + 0x28: 0x33104, // head + 0x29: 0x4ff0c, // onmouseleave + 0x2a: 0x57f07, // onpaste + 0x2b: 0x5a409, // onplaying + 0x2c: 0x1c407, // colspan + 0x2f: 0x1bf05, // color + 0x30: 0x5f504, // size + 0x31: 0x2e80a, // http-equiv + 0x33: 0x601, // i + 0x34: 0x5590a, // onpagehide + 0x35: 0x68c14, // onunhandledrejection + 0x37: 0x42a07, // onerror + 0x3a: 0x3b08, // basefont + 0x3f: 0x1303, // nav + 0x40: 0x17704, // kind + 0x41: 0x35708, // readonly + 0x42: 0x30806, // mglyph + 0x44: 0xb202, // li + 0x46: 0x2d506, // hidden + 0x47: 0x70e03, // svg + 0x48: 0x58304, // step + 0x49: 0x23f09, // integrity + 0x4a: 0x58606, // public + 0x4c: 0x1ab03, // col + 0x4d: 0x1870a, // blockquote + 0x4e: 0x34f02, // h5 + 0x50: 0x5b908, // progress + 0x51: 0x5f505, // sizes + 0x52: 0x34502, // h4 + 0x56: 0x33005, // thead + 0x57: 0xd607, // keytype + 0x58: 0x5b70a, // onprogress + 0x59: 0x44b09, // inputmode + 0x5a: 0x3b109, // ondragend + 0x5d: 0x3a205, // oncut + 0x5e: 0x43706, // spacer + 0x5f: 0x1ab08, // colgroup + 0x62: 0x16502, // is + 0x65: 0x3c02, // as + 0x66: 0x54809, // onoffline + 0x67: 0x33706, // sorted + 0x69: 0x48d10, // onlanguagechange + 0x6c: 0x43d0c, // onhashchange + 0x6d: 0x9604, // name + 0x6e: 0xf505, // tfoot + 0x6f: 0x56104, // desc + 0x70: 0x33d03, // max + 0x72: 0x1ea06, // coords + 0x73: 0x30d02, // h3 + 0x74: 0x6e70e, // onbeforeunload + 0x75: 0x9c04, // rows + 0x76: 0x63c06, // select + 0x77: 0x9805, // meter + 0x78: 0x38b06, // itemid + 0x79: 0x53c0c, // onmousewheel + 0x7a: 0x5c006, // srcdoc + 0x7d: 0x1ba05, // track + 0x7f: 0x31f08, // itemtype + 0x82: 0xa402, // mo + 0x83: 0x41b08, // onchange + 0x84: 0x33107, // headers + 0x85: 0x5cc0c, // onratechange + 0x86: 0x60819, // onsecuritypolicyviolation + 0x88: 0x4a508, // datalist + 0x89: 0x4e80b, // onmousedown + 0x8a: 0x1ef04, // slot + 0x8b: 0x4b010, // onloadedmetadata + 0x8c: 0x1a06, // accept + 0x8d: 0x26806, // object + 0x91: 0x6b30e, // onvolumechange + 0x92: 0x2107, // charset + 0x93: 0x27613, // onautocompleteerror + 0x94: 0xc113, // allowpaymentrequest + 0x95: 0x2804, // body + 0x96: 0x10a07, // default + 0x97: 0x63c08, // selected + 0x98: 0x21e04, // face + 0x99: 0x1e505, // shape + 0x9b: 0x68408, // ontoggle + 0x9e: 0x64b02, // dt + 0x9f: 0xb604, // mark + 0xa1: 0xb01, // u + 0xa4: 0x6ab08, // onunload + 0xa5: 0x5d04, // loop + 0xa6: 0x16408, // disabled + 0xaa: 0x42307, // onended + 0xab: 0xb00a, // malignmark + 0xad: 0x67b09, // onsuspend + 0xae: 0x35105, // mtext + 0xaf: 0x64f06, // onsort + 0xb0: 0x19d08, // itemprop + 0xb3: 0x67109, // itemscope + 0xb4: 0x17305, // blink + 0xb6: 0x3b106, // ondrag + 0xb7: 0xa702, // ul + 0xb8: 0x26e04, // form + 0xb9: 0x12907, // sandbox + 0xba: 0x8b05, // frame + 0xbb: 0x1505, // value + 0xbc: 0x66209, // onstorage + 0xbf: 0xaa07, // acronym + 0xc0: 0x19a02, // rt + 0xc2: 0x202, // br + 0xc3: 0x22608, // fieldset + 0xc4: 0x2900d, // typemustmatch + 0xc5: 0xa208, // nomodule + 0xc6: 0x6c07, // noembed + 0xc7: 0x69e0d, // onbeforeprint + 0xc8: 0x19106, // button + 0xc9: 0x2f507, // onclick + 0xca: 0x70407, // summary + 0xcd: 0xfb04, // ruby + 0xce: 0x56405, // class + 0xcf: 0x3f40b, // ondragstart + 0xd0: 0x23107, // caption + 0xd4: 0xdd0e, // allowusermedia + 0xd5: 0x4cf0b, // onloadstart + 0xd9: 0x16b03, // div + 0xda: 0x4a904, // list + 0xdb: 0x32e04, // math + 0xdc: 0x44b05, // input + 0xdf: 0x3ea0a, // ondragover + 0xe0: 0x2de02, // h2 + 0xe2: 0x1b209, // plaintext + 0xe4: 0x4f30c, // onmouseenter + 0xe7: 0x47907, // checked + 0xe8: 0x47003, // pre + 0xea: 0x35f08, // multiple + 0xeb: 0xba03, // bdi + 0xec: 0x33d09, // maxlength + 0xed: 0xcf01, // q + 0xee: 0x61f0a, // onauxclick + 0xf0: 0x57c03, // wbr + 0xf2: 0x3b04, // base + 0xf3: 0x6e306, // option + 0xf5: 0x41310, // ondurationchange + 0xf7: 0x8908, // noframes + 0xf9: 0x40508, // dropzone + 0xfb: 0x67505, // scope + 0xfc: 0x8008, // reversed + 0xfd: 0x3ba0b, // ondragenter + 0xfe: 0x3fa05, // start + 0xff: 0x12f03, // xmp + 0x100: 0x5f907, // srclang + 0x101: 0x30703, // img + 0x104: 0x101, // b + 0x105: 0x25403, // for + 0x106: 0x10705, // aside + 0x107: 0x44907, // oninput + 0x108: 0x35604, // area + 0x109: 0x2a40a, // formmethod + 0x10a: 0x72604, // wrap + 0x10c: 0x23c02, // rp + 0x10d: 0x46b0a, // onkeypress + 0x10e: 0x6802, // tt + 0x110: 0x34702, // mi + 0x111: 0x36705, // muted + 0x112: 0xf303, // alt + 0x113: 0x5c504, // code + 0x114: 0x6e02, // em + 0x115: 0x3c50a, // ondragexit + 0x117: 0x9f04, // span + 0x119: 0x6d708, // manifest + 0x11a: 0x38708, // menuitem + 0x11b: 0x58b07, // content + 0x11d: 0x6c109, // onwaiting + 0x11f: 0x4c609, // onloadend + 0x121: 0x37e0d, // oncontextmenu + 0x123: 0x56d06, // onblur + 0x124: 0x3fc07, // article + 0x125: 0x9303, // dir + 0x126: 0xef04, // ping + 0x127: 0x24c08, // required + 0x128: 0x45509, // oninvalid + 0x129: 0xb105, // align + 0x12b: 0x58a04, // icon + 0x12c: 0x64d02, // h6 + 0x12d: 0x1c404, // cols + 0x12e: 0x22e0a, // figcaption + 0x12f: 0x45e09, // onkeydown + 0x130: 0x66b08, // onsubmit + 0x131: 0x14d09, // oncanplay + 0x132: 0x70b03, // sup + 0x133: 0xc01, // p + 0x135: 0x40a09, // onemptied + 0x136: 0x39106, // oncopy + 0x137: 0x19c04, // cite + 0x138: 0x3a70a, // ondblclick + 0x13a: 0x50b0b, // onmousemove + 0x13c: 0x66d03, // sub + 0x13d: 0x48703, // rel + 0x13e: 0x5f08, // optgroup + 0x142: 0x9c07, // rowspan + 0x143: 0x37806, // source + 0x144: 0x21608, // noscript + 0x145: 0x1a304, // open + 0x146: 0x20403, // ins + 0x147: 0x2540d, // foreignObject + 0x148: 0x5ad0a, // onpopstate + 0x14a: 0x28d07, // enctype + 0x14b: 0x2760e, // onautocomplete + 0x14c: 0x35208, // textarea + 0x14e: 0x2780c, // autocomplete + 0x14f: 0x15702, // hr + 0x150: 0x1de08, // controls + 0x151: 0x10902, // id + 0x153: 0x2360c, // onafterprint + 0x155: 0x2610d, // foreignobject + 0x156: 0x32707, // marquee + 0x157: 0x59a07, // onpause + 0x158: 0x5e602, // dl + 0x159: 0x5206, // height + 0x15a: 0x34703, // min + 0x15b: 0x9307, // dirname + 0x15c: 0x1f209, // translate + 0x15d: 0x5604, // html + 0x15e: 0x34709, // minlength + 0x15f: 0x48607, // preload + 0x160: 0x71408, // template + 0x161: 0x3df0b, // ondragleave + 0x162: 0x3a02, // rb + 0x164: 0x5c003, // src + 0x165: 0x6dd06, // strong + 0x167: 0x7804, // samp + 0x168: 0x6f307, // address + 0x169: 0x55108, // ononline + 0x16b: 0x1310b, // placeholder + 0x16c: 0x2c406, // target + 0x16d: 0x20605, // small + 0x16e: 0x6ca07, // onwheel + 0x16f: 0x1c90a, // annotation + 0x170: 0x4740a, // spellcheck + 0x171: 0x7207, // details + 0x172: 0x10306, // canvas + 0x173: 0x12109, // autofocus + 0x174: 0xc05, // param + 0x176: 0x46308, // download + 0x177: 0x45203, // del + 0x178: 0x36c07, // onclose + 0x179: 0xb903, // kbd + 0x17a: 0x31906, // applet + 0x17b: 0x2e004, // href + 0x17c: 0x5f108, // onresize + 0x17e: 0x49d0c, // onloadeddata + 0x180: 0xcc02, // tr + 0x181: 0x2c00a, // formtarget + 0x182: 0x11005, // title + 0x183: 0x6ff05, // style + 0x184: 0xd206, // strike + 0x185: 0x59e06, // usemap + 0x186: 0x2fc06, // iframe + 0x187: 0x1004, // main + 0x189: 0x7b07, // picture + 0x18c: 0x31605, // ismap + 0x18e: 0x4a504, // data + 0x18f: 0x5905, // label + 0x191: 0x3d10e, // referrerpolicy + 0x192: 0x15602, // th + 0x194: 0x53606, // prompt + 0x195: 0x56807, // section + 0x197: 0x6d107, // optimum + 0x198: 0x2db04, // high + 0x199: 0x15c02, // h1 + 0x19a: 0x65909, // onstalled + 0x19b: 0x16d03, // var + 0x19c: 0x4204, // time + 0x19e: 0x67402, // ms + 0x19f: 0x33106, // header + 0x1a0: 0x4da09, // onmessage + 0x1a1: 0x1a605, // nonce + 0x1a2: 0x26e0a, // formaction + 0x1a3: 0x22006, // center + 0x1a4: 0x3704, // nobr + 0x1a5: 0x59505, // table + 0x1a6: 0x4a907, // listing + 0x1a7: 0x18106, // legend + 0x1a9: 0x29b09, // challenge + 0x1aa: 0x24806, // figure + 0x1ab: 0xe605, // media + 0x1ae: 0xd904, // type + 0x1af: 0x3f04, // font + 0x1b0: 0x4da0e, // onmessageerror + 0x1b1: 0x37108, // seamless + 0x1b2: 0x8703, // dfn + 0x1b3: 0x5c705, // defer + 0x1b4: 0xc303, // low + 0x1b5: 0x19a03, // rtc + 0x1b6: 0x5230b, // onmouseover + 0x1b7: 0x2b20a, // novalidate + 0x1b8: 0x71c0a, // workertype + 0x1ba: 0x3cd07, // itemref + 0x1bd: 0x1, // a + 0x1be: 0x31803, // map + 0x1bf: 0x400c, // ontimeupdate + 0x1c0: 0x15e07, // bgsound + 0x1c1: 0x3206, // keygen + 0x1c2: 0x2705, // tbody + 0x1c5: 0x64406, // onshow + 0x1c7: 0x2501, // s + 0x1c8: 0x6607, // pattern + 0x1cc: 0x14d10, // oncanplaythrough + 0x1ce: 0x2d702, // dd + 0x1cf: 0x6f906, // srcset + 0x1d0: 0x17003, // big + 0x1d2: 0x65108, // sortable + 0x1d3: 0x48007, // onkeyup + 0x1d5: 0x5a406, // onplay + 0x1d7: 0x4b804, // meta + 0x1d8: 0x40306, // ondrop + 0x1da: 0x60008, // onscroll + 0x1db: 0x1fb0b, // crossorigin + 0x1dc: 0x5730a, // onpageshow + 0x1dd: 0x4, // abbr + 0x1de: 0x9202, // td + 0x1df: 0x58b0f, // contenteditable + 0x1e0: 0x27206, // action + 0x1e1: 0x1400b, // playsinline + 0x1e2: 0x43107, // onfocus + 0x1e3: 0x2e008, // hreflang + 0x1e5: 0x5160a, // onmouseout + 0x1e6: 0x5ea07, // onreset + 0x1e7: 0x13c08, // autoplay + 0x1e8: 0x63109, // onseeking + 0x1ea: 0x67506, // scoped + 0x1ec: 0x30a, // radiogroup + 0x1ee: 0x3800b, // contextmenu + 0x1ef: 0x52e09, // onmouseup + 0x1f1: 0x2ca06, // hgroup + 0x1f2: 0x2080f, // allowfullscreen + 0x1f3: 0x4be08, // tabindex + 0x1f6: 0x30f07, // isindex + 0x1f7: 0x1a0e, // accept-charset + 0x1f8: 0x2ae0e, // formnovalidate + 0x1fb: 0x1c90e, // annotation-xml + 0x1fc: 0x6e05, // embed + 0x1fd: 0x21806, // script + 0x1fe: 0xbb06, // dialog + 0x1ff: 0x1d707, // command +} + +const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobrb" + + "asefontimeupdateviacacheightmlabelooptgroupatternoembedetail" + + "sampictureversedfnoframesetdirnameterowspanomoduleacronymali" + + "gnmarkbdialogallowpaymentrequestrikeytypeallowusermediagroup" + + "ingaltfooterubyasyncanvasidefaultitleaudioncancelautofocusan" + + "dboxmplaceholderautoplaysinlinebdoncanplaythrough1bgsoundisa" + + "bledivarbigblinkindraggablegendblockquotebuttonabortcitempro" + + "penoncecolgrouplaintextrackcolorcolspannotation-xmlcommandco" + + "ntrolshapecoordslotranslatecrossoriginsmallowfullscreenoscri" + + "ptfacenterfieldsetfigcaptionafterprintegrityfigurequiredfore" + + "ignObjectforeignobjectformactionautocompleteerrorformenctype" + + "mustmatchallengeformmethodformnovalidatetimeformtargethgroup" + + "osterhiddenhigh2hreflanghttp-equivideonclickiframeimageimgly" + + "ph3isindexismappletitemtypemarqueematheadersortedmaxlength4m" + + "inlength5mtextareadonlymultiplemutedoncloseamlessourceoncont" + + "extmenuitemidoncopyoncuechangeoncutondblclickondragendondrag" + + "enterondragexitemreferrerpolicyondragleaveondragoverondragst" + + "articleondropzonemptiedondurationchangeonendedonerroronfocus" + + "paceronhashchangeoninputmodeloninvalidonkeydownloadonkeypres" + + "spellcheckedonkeyupreloadonlanguagechangeonloadeddatalisting" + + "onloadedmetadatabindexonloadendonloadstartonmessageerroronmo" + + "usedownonmouseenteronmouseleaveonmousemoveonmouseoutputonmou" + + "seoveronmouseupromptonmousewheelonofflineononlineonpagehides" + + "classectionbluronpageshowbronpastepublicontenteditableonpaus" + + "emaponplayingonpopstateonprogressrcdocodeferonratechangeonre" + + "jectionhandledonresetonresizesrclangonscrollonsecuritypolicy" + + "violationauxclickonseekedonseekingonselectedonshowidth6onsor" + + "tableonstalledonstorageonsubmitemscopedonsuspendontoggleonun" + + "handledrejectionbeforeprintonunloadonvolumechangeonwaitingon" + + "wheeloptimumanifestrongoptionbeforeunloaddressrcsetstylesumm" + + "arysupsvgsystemplateworkertypewrap" diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go new file mode 100644 index 00000000..ff7acf2d --- /dev/null +++ b/vendor/golang.org/x/net/html/const.go @@ -0,0 +1,111 @@ +// 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 html + +// Section 12.2.4.2 of the HTML5 specification says "The following elements +// have varying levels of special parsing rules". +// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements +var isSpecialElementMap = map[string]bool{ + "address": true, + "applet": true, + "area": true, + "article": true, + "aside": true, + "base": true, + "basefont": true, + "bgsound": true, + "blockquote": true, + "body": true, + "br": true, + "button": true, + "caption": true, + "center": true, + "col": true, + "colgroup": true, + "dd": true, + "details": true, + "dir": true, + "div": true, + "dl": true, + "dt": true, + "embed": true, + "fieldset": true, + "figcaption": true, + "figure": true, + "footer": true, + "form": true, + "frame": true, + "frameset": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "header": true, + "hgroup": true, + "hr": true, + "html": true, + "iframe": true, + "img": true, + "input": true, + "keygen": true, // "keygen" has been removed from the spec, but are kept here for backwards compatibility. + "li": true, + "link": true, + "listing": true, + "main": true, + "marquee": true, + "menu": true, + "meta": true, + "nav": true, + "noembed": true, + "noframes": true, + "noscript": true, + "object": true, + "ol": true, + "p": true, + "param": true, + "plaintext": true, + "pre": true, + "script": true, + "section": true, + "select": true, + "source": true, + "style": true, + "summary": true, + "table": true, + "tbody": true, + "td": true, + "template": true, + "textarea": true, + "tfoot": true, + "th": true, + "thead": true, + "title": true, + "tr": true, + "track": true, + "ul": true, + "wbr": true, + "xmp": true, +} + +func isSpecialElement(element *Node) bool { + switch element.Namespace { + case "", "html": + return isSpecialElementMap[element.Data] + case "math": + switch element.Data { + case "mi", "mo", "mn", "ms", "mtext", "annotation-xml": + return true + } + case "svg": + switch element.Data { + case "foreignObject", "desc", "title": + return true + } + } + return false +} diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go new file mode 100644 index 00000000..885c4c59 --- /dev/null +++ b/vendor/golang.org/x/net/html/doc.go @@ -0,0 +1,122 @@ +// 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 html implements an HTML5-compliant tokenizer and parser. + +Tokenization is done by creating a Tokenizer for an io.Reader r. It is the +caller's responsibility to ensure that r provides UTF-8 encoded HTML. + + z := html.NewTokenizer(r) + +Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), +which parses the next token and returns its type, or an error: + + for { + tt := z.Next() + if tt == html.ErrorToken { + // ... + return ... + } + // Process the current token. + } + +There are two APIs for retrieving the current token. The high-level API is to +call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs +allow optionally calling Raw after Next but before Token, Text, TagName, or +TagAttr. In EBNF notation, the valid call sequence per token is: + + Next {Raw} [ Token | Text | TagName {TagAttr} ] + +Token returns an independent data structure that completely describes a token. +Entities (such as "<") are unescaped, tag names and attribute keys are +lower-cased, and attributes are collected into a []Attribute. For example: + + for { + if z.Next() == html.ErrorToken { + // Returning io.EOF indicates success. + return z.Err() + } + emitToken(z.Token()) + } + +The low-level API performs fewer allocations and copies, but the contents of +the []byte values returned by Text, TagName and TagAttr may change on the next +call to Next. For example, to extract an HTML page's anchor text: + + depth := 0 + for { + tt := z.Next() + switch tt { + case html.ErrorToken: + return z.Err() + case html.TextToken: + if depth > 0 { + // emitBytes should copy the []byte it receives, + // if it doesn't process it immediately. + emitBytes(z.Text()) + } + case html.StartTagToken, html.EndTagToken: + tn, _ := z.TagName() + if len(tn) == 1 && tn[0] == 'a' { + if tt == html.StartTagToken { + depth++ + } else { + depth-- + } + } + } + } + +Parsing is done by calling Parse with an io.Reader, which returns the root of +the parse tree (the document element) as a *Node. It is the caller's +responsibility to ensure that the Reader provides UTF-8 encoded HTML. For +example, to process each anchor node in depth-first order: + + doc, err := html.Parse(r) + if err != nil { + // ... + } + for n := range doc.Descendants() { + if n.Type == html.ElementNode && n.Data == "a" { + // Do something with n... + } + } + +The relevant specifications include: +https://html.spec.whatwg.org/multipage/syntax.html and +https://html.spec.whatwg.org/multipage/syntax.html#tokenization + +# Security Considerations + +Care should be taken when parsing and interpreting HTML, whether full documents +or fragments, within the framework of the HTML specification, especially with +regard to untrusted inputs. + +This package provides both a tokenizer and a parser, which implement the +tokenization, and tokenization and tree construction stages of the WHATWG HTML +parsing specification respectively. While the tokenizer parses and normalizes +individual HTML tokens, only the parser constructs the DOM tree from the +tokenized HTML, as described in the tree construction stage of the +specification, dynamically modifying or extending the document's DOM tree. + +If your use case requires semantically well-formed HTML documents, as defined by +the WHATWG specification, the parser should be used rather than the tokenizer. + +In security contexts, if trust decisions are being made using the tokenized or +parsed content, the input must be re-serialized (for instance by using Render or +Token.String) in order for those trust decisions to hold, as the process of +tokenization or parsing may alter the content. +*/ +package html // import "golang.org/x/net/html" + +// The tokenization algorithm implemented by this package is not a line-by-line +// transliteration of the relatively verbose state-machine in the WHATWG +// specification. A more direct approach is used instead, where the program +// counter implies the state, such as whether it is tokenizing a tag or a text +// node. Specification compliance is verified by checking expected and actual +// outputs over a test suite rather than aiming for algorithmic fidelity. + +// TODO(nigeltao): Does a DOM API belong in this package or a separate one? +// TODO(nigeltao): How does parsing interact with a JavaScript engine? diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go new file mode 100644 index 00000000..c484e5a9 --- /dev/null +++ b/vendor/golang.org/x/net/html/doctype.go @@ -0,0 +1,156 @@ +// 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 html + +import ( + "strings" +) + +// parseDoctype parses the data from a DoctypeToken into a name, +// public identifier, and system identifier. It returns a Node whose Type +// is DoctypeNode, whose Data is the name, and which has attributes +// named "system" and "public" for the two identifiers if they were present. +// quirks is whether the document should be parsed in "quirks mode". +func parseDoctype(s string) (n *Node, quirks bool) { + n = &Node{Type: DoctypeNode} + + // Find the name. + space := strings.IndexAny(s, whitespace) + if space == -1 { + space = len(s) + } + n.Data = s[:space] + // The comparison to "html" is case-sensitive. + if n.Data != "html" { + quirks = true + } + n.Data = strings.ToLower(n.Data) + s = strings.TrimLeft(s[space:], whitespace) + + if len(s) < 6 { + // It can't start with "PUBLIC" or "SYSTEM". + // Ignore the rest of the string. + return n, quirks || s != "" + } + + key := strings.ToLower(s[:6]) + s = s[6:] + for key == "public" || key == "system" { + s = strings.TrimLeft(s, whitespace) + if s == "" { + break + } + quote := s[0] + if quote != '"' && quote != '\'' { + break + } + s = s[1:] + q := strings.IndexRune(s, rune(quote)) + var id string + if q == -1 { + id = s + s = "" + } else { + id = s[:q] + s = s[q+1:] + } + n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) + if key == "public" { + key = "system" + } else { + key = "" + } + } + + if key != "" || s != "" { + quirks = true + } else if len(n.Attr) > 0 { + if n.Attr[0].Key == "public" { + public := strings.ToLower(n.Attr[0].Val) + switch public { + case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": + quirks = true + default: + for _, q := range quirkyIDs { + if strings.HasPrefix(public, q) { + quirks = true + break + } + } + } + // The following two public IDs only cause quirks mode if there is no system ID. + if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || + strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { + quirks = true + } + } + if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && + strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { + quirks = true + } + } + + return n, quirks +} + +// quirkyIDs is a list of public doctype identifiers that cause a document +// to be interpreted in quirks mode. The identifiers should be in lower case. +var quirkyIDs = []string{ + "+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//", +} diff --git a/vendor/golang.org/x/net/html/entity.go b/vendor/golang.org/x/net/html/entity.go new file mode 100644 index 00000000..b628880a --- /dev/null +++ b/vendor/golang.org/x/net/html/entity.go @@ -0,0 +1,2253 @@ +// 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 html + +// All entities that do not end with ';' are 6 or fewer bytes long. +const longestEntityWithoutSemicolon = 6 + +// entity is a map from HTML entity names to their values. The semicolon matters: +// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references +// lists both "amp" and "amp;" as two separate entries. +// +// Note that the HTML5 list is larger than the HTML4 list at +// http://www.w3.org/TR/html4/sgml/entities.html +var entity = map[string]rune{ + "AElig;": '\U000000C6', + "AMP;": '\U00000026', + "Aacute;": '\U000000C1', + "Abreve;": '\U00000102', + "Acirc;": '\U000000C2', + "Acy;": '\U00000410', + "Afr;": '\U0001D504', + "Agrave;": '\U000000C0', + "Alpha;": '\U00000391', + "Amacr;": '\U00000100', + "And;": '\U00002A53', + "Aogon;": '\U00000104', + "Aopf;": '\U0001D538', + "ApplyFunction;": '\U00002061', + "Aring;": '\U000000C5', + "Ascr;": '\U0001D49C', + "Assign;": '\U00002254', + "Atilde;": '\U000000C3', + "Auml;": '\U000000C4', + "Backslash;": '\U00002216', + "Barv;": '\U00002AE7', + "Barwed;": '\U00002306', + "Bcy;": '\U00000411', + "Because;": '\U00002235', + "Bernoullis;": '\U0000212C', + "Beta;": '\U00000392', + "Bfr;": '\U0001D505', + "Bopf;": '\U0001D539', + "Breve;": '\U000002D8', + "Bscr;": '\U0000212C', + "Bumpeq;": '\U0000224E', + "CHcy;": '\U00000427', + "COPY;": '\U000000A9', + "Cacute;": '\U00000106', + "Cap;": '\U000022D2', + "CapitalDifferentialD;": '\U00002145', + "Cayleys;": '\U0000212D', + "Ccaron;": '\U0000010C', + "Ccedil;": '\U000000C7', + "Ccirc;": '\U00000108', + "Cconint;": '\U00002230', + "Cdot;": '\U0000010A', + "Cedilla;": '\U000000B8', + "CenterDot;": '\U000000B7', + "Cfr;": '\U0000212D', + "Chi;": '\U000003A7', + "CircleDot;": '\U00002299', + "CircleMinus;": '\U00002296', + "CirclePlus;": '\U00002295', + "CircleTimes;": '\U00002297', + "ClockwiseContourIntegral;": '\U00002232', + "CloseCurlyDoubleQuote;": '\U0000201D', + "CloseCurlyQuote;": '\U00002019', + "Colon;": '\U00002237', + "Colone;": '\U00002A74', + "Congruent;": '\U00002261', + "Conint;": '\U0000222F', + "ContourIntegral;": '\U0000222E', + "Copf;": '\U00002102', + "Coproduct;": '\U00002210', + "CounterClockwiseContourIntegral;": '\U00002233', + "Cross;": '\U00002A2F', + "Cscr;": '\U0001D49E', + "Cup;": '\U000022D3', + "CupCap;": '\U0000224D', + "DD;": '\U00002145', + "DDotrahd;": '\U00002911', + "DJcy;": '\U00000402', + "DScy;": '\U00000405', + "DZcy;": '\U0000040F', + "Dagger;": '\U00002021', + "Darr;": '\U000021A1', + "Dashv;": '\U00002AE4', + "Dcaron;": '\U0000010E', + "Dcy;": '\U00000414', + "Del;": '\U00002207', + "Delta;": '\U00000394', + "Dfr;": '\U0001D507', + "DiacriticalAcute;": '\U000000B4', + "DiacriticalDot;": '\U000002D9', + "DiacriticalDoubleAcute;": '\U000002DD', + "DiacriticalGrave;": '\U00000060', + "DiacriticalTilde;": '\U000002DC', + "Diamond;": '\U000022C4', + "DifferentialD;": '\U00002146', + "Dopf;": '\U0001D53B', + "Dot;": '\U000000A8', + "DotDot;": '\U000020DC', + "DotEqual;": '\U00002250', + "DoubleContourIntegral;": '\U0000222F', + "DoubleDot;": '\U000000A8', + "DoubleDownArrow;": '\U000021D3', + "DoubleLeftArrow;": '\U000021D0', + "DoubleLeftRightArrow;": '\U000021D4', + "DoubleLeftTee;": '\U00002AE4', + "DoubleLongLeftArrow;": '\U000027F8', + "DoubleLongLeftRightArrow;": '\U000027FA', + "DoubleLongRightArrow;": '\U000027F9', + "DoubleRightArrow;": '\U000021D2', + "DoubleRightTee;": '\U000022A8', + "DoubleUpArrow;": '\U000021D1', + "DoubleUpDownArrow;": '\U000021D5', + "DoubleVerticalBar;": '\U00002225', + "DownArrow;": '\U00002193', + "DownArrowBar;": '\U00002913', + "DownArrowUpArrow;": '\U000021F5', + "DownBreve;": '\U00000311', + "DownLeftRightVector;": '\U00002950', + "DownLeftTeeVector;": '\U0000295E', + "DownLeftVector;": '\U000021BD', + "DownLeftVectorBar;": '\U00002956', + "DownRightTeeVector;": '\U0000295F', + "DownRightVector;": '\U000021C1', + "DownRightVectorBar;": '\U00002957', + "DownTee;": '\U000022A4', + "DownTeeArrow;": '\U000021A7', + "Downarrow;": '\U000021D3', + "Dscr;": '\U0001D49F', + "Dstrok;": '\U00000110', + "ENG;": '\U0000014A', + "ETH;": '\U000000D0', + "Eacute;": '\U000000C9', + "Ecaron;": '\U0000011A', + "Ecirc;": '\U000000CA', + "Ecy;": '\U0000042D', + "Edot;": '\U00000116', + "Efr;": '\U0001D508', + "Egrave;": '\U000000C8', + "Element;": '\U00002208', + "Emacr;": '\U00000112', + "EmptySmallSquare;": '\U000025FB', + "EmptyVerySmallSquare;": '\U000025AB', + "Eogon;": '\U00000118', + "Eopf;": '\U0001D53C', + "Epsilon;": '\U00000395', + "Equal;": '\U00002A75', + "EqualTilde;": '\U00002242', + "Equilibrium;": '\U000021CC', + "Escr;": '\U00002130', + "Esim;": '\U00002A73', + "Eta;": '\U00000397', + "Euml;": '\U000000CB', + "Exists;": '\U00002203', + "ExponentialE;": '\U00002147', + "Fcy;": '\U00000424', + "Ffr;": '\U0001D509', + "FilledSmallSquare;": '\U000025FC', + "FilledVerySmallSquare;": '\U000025AA', + "Fopf;": '\U0001D53D', + "ForAll;": '\U00002200', + "Fouriertrf;": '\U00002131', + "Fscr;": '\U00002131', + "GJcy;": '\U00000403', + "GT;": '\U0000003E', + "Gamma;": '\U00000393', + "Gammad;": '\U000003DC', + "Gbreve;": '\U0000011E', + "Gcedil;": '\U00000122', + "Gcirc;": '\U0000011C', + "Gcy;": '\U00000413', + "Gdot;": '\U00000120', + "Gfr;": '\U0001D50A', + "Gg;": '\U000022D9', + "Gopf;": '\U0001D53E', + "GreaterEqual;": '\U00002265', + "GreaterEqualLess;": '\U000022DB', + "GreaterFullEqual;": '\U00002267', + "GreaterGreater;": '\U00002AA2', + "GreaterLess;": '\U00002277', + "GreaterSlantEqual;": '\U00002A7E', + "GreaterTilde;": '\U00002273', + "Gscr;": '\U0001D4A2', + "Gt;": '\U0000226B', + "HARDcy;": '\U0000042A', + "Hacek;": '\U000002C7', + "Hat;": '\U0000005E', + "Hcirc;": '\U00000124', + "Hfr;": '\U0000210C', + "HilbertSpace;": '\U0000210B', + "Hopf;": '\U0000210D', + "HorizontalLine;": '\U00002500', + "Hscr;": '\U0000210B', + "Hstrok;": '\U00000126', + "HumpDownHump;": '\U0000224E', + "HumpEqual;": '\U0000224F', + "IEcy;": '\U00000415', + "IJlig;": '\U00000132', + "IOcy;": '\U00000401', + "Iacute;": '\U000000CD', + "Icirc;": '\U000000CE', + "Icy;": '\U00000418', + "Idot;": '\U00000130', + "Ifr;": '\U00002111', + "Igrave;": '\U000000CC', + "Im;": '\U00002111', + "Imacr;": '\U0000012A', + "ImaginaryI;": '\U00002148', + "Implies;": '\U000021D2', + "Int;": '\U0000222C', + "Integral;": '\U0000222B', + "Intersection;": '\U000022C2', + "InvisibleComma;": '\U00002063', + "InvisibleTimes;": '\U00002062', + "Iogon;": '\U0000012E', + "Iopf;": '\U0001D540', + "Iota;": '\U00000399', + "Iscr;": '\U00002110', + "Itilde;": '\U00000128', + "Iukcy;": '\U00000406', + "Iuml;": '\U000000CF', + "Jcirc;": '\U00000134', + "Jcy;": '\U00000419', + "Jfr;": '\U0001D50D', + "Jopf;": '\U0001D541', + "Jscr;": '\U0001D4A5', + "Jsercy;": '\U00000408', + "Jukcy;": '\U00000404', + "KHcy;": '\U00000425', + "KJcy;": '\U0000040C', + "Kappa;": '\U0000039A', + "Kcedil;": '\U00000136', + "Kcy;": '\U0000041A', + "Kfr;": '\U0001D50E', + "Kopf;": '\U0001D542', + "Kscr;": '\U0001D4A6', + "LJcy;": '\U00000409', + "LT;": '\U0000003C', + "Lacute;": '\U00000139', + "Lambda;": '\U0000039B', + "Lang;": '\U000027EA', + "Laplacetrf;": '\U00002112', + "Larr;": '\U0000219E', + "Lcaron;": '\U0000013D', + "Lcedil;": '\U0000013B', + "Lcy;": '\U0000041B', + "LeftAngleBracket;": '\U000027E8', + "LeftArrow;": '\U00002190', + "LeftArrowBar;": '\U000021E4', + "LeftArrowRightArrow;": '\U000021C6', + "LeftCeiling;": '\U00002308', + "LeftDoubleBracket;": '\U000027E6', + "LeftDownTeeVector;": '\U00002961', + "LeftDownVector;": '\U000021C3', + "LeftDownVectorBar;": '\U00002959', + "LeftFloor;": '\U0000230A', + "LeftRightArrow;": '\U00002194', + "LeftRightVector;": '\U0000294E', + "LeftTee;": '\U000022A3', + "LeftTeeArrow;": '\U000021A4', + "LeftTeeVector;": '\U0000295A', + "LeftTriangle;": '\U000022B2', + "LeftTriangleBar;": '\U000029CF', + "LeftTriangleEqual;": '\U000022B4', + "LeftUpDownVector;": '\U00002951', + "LeftUpTeeVector;": '\U00002960', + "LeftUpVector;": '\U000021BF', + "LeftUpVectorBar;": '\U00002958', + "LeftVector;": '\U000021BC', + "LeftVectorBar;": '\U00002952', + "Leftarrow;": '\U000021D0', + "Leftrightarrow;": '\U000021D4', + "LessEqualGreater;": '\U000022DA', + "LessFullEqual;": '\U00002266', + "LessGreater;": '\U00002276', + "LessLess;": '\U00002AA1', + "LessSlantEqual;": '\U00002A7D', + "LessTilde;": '\U00002272', + "Lfr;": '\U0001D50F', + "Ll;": '\U000022D8', + "Lleftarrow;": '\U000021DA', + "Lmidot;": '\U0000013F', + "LongLeftArrow;": '\U000027F5', + "LongLeftRightArrow;": '\U000027F7', + "LongRightArrow;": '\U000027F6', + "Longleftarrow;": '\U000027F8', + "Longleftrightarrow;": '\U000027FA', + "Longrightarrow;": '\U000027F9', + "Lopf;": '\U0001D543', + "LowerLeftArrow;": '\U00002199', + "LowerRightArrow;": '\U00002198', + "Lscr;": '\U00002112', + "Lsh;": '\U000021B0', + "Lstrok;": '\U00000141', + "Lt;": '\U0000226A', + "Map;": '\U00002905', + "Mcy;": '\U0000041C', + "MediumSpace;": '\U0000205F', + "Mellintrf;": '\U00002133', + "Mfr;": '\U0001D510', + "MinusPlus;": '\U00002213', + "Mopf;": '\U0001D544', + "Mscr;": '\U00002133', + "Mu;": '\U0000039C', + "NJcy;": '\U0000040A', + "Nacute;": '\U00000143', + "Ncaron;": '\U00000147', + "Ncedil;": '\U00000145', + "Ncy;": '\U0000041D', + "NegativeMediumSpace;": '\U0000200B', + "NegativeThickSpace;": '\U0000200B', + "NegativeThinSpace;": '\U0000200B', + "NegativeVeryThinSpace;": '\U0000200B', + "NestedGreaterGreater;": '\U0000226B', + "NestedLessLess;": '\U0000226A', + "NewLine;": '\U0000000A', + "Nfr;": '\U0001D511', + "NoBreak;": '\U00002060', + "NonBreakingSpace;": '\U000000A0', + "Nopf;": '\U00002115', + "Not;": '\U00002AEC', + "NotCongruent;": '\U00002262', + "NotCupCap;": '\U0000226D', + "NotDoubleVerticalBar;": '\U00002226', + "NotElement;": '\U00002209', + "NotEqual;": '\U00002260', + "NotExists;": '\U00002204', + "NotGreater;": '\U0000226F', + "NotGreaterEqual;": '\U00002271', + "NotGreaterLess;": '\U00002279', + "NotGreaterTilde;": '\U00002275', + "NotLeftTriangle;": '\U000022EA', + "NotLeftTriangleEqual;": '\U000022EC', + "NotLess;": '\U0000226E', + "NotLessEqual;": '\U00002270', + "NotLessGreater;": '\U00002278', + "NotLessTilde;": '\U00002274', + "NotPrecedes;": '\U00002280', + "NotPrecedesSlantEqual;": '\U000022E0', + "NotReverseElement;": '\U0000220C', + "NotRightTriangle;": '\U000022EB', + "NotRightTriangleEqual;": '\U000022ED', + "NotSquareSubsetEqual;": '\U000022E2', + "NotSquareSupersetEqual;": '\U000022E3', + "NotSubsetEqual;": '\U00002288', + "NotSucceeds;": '\U00002281', + "NotSucceedsSlantEqual;": '\U000022E1', + "NotSupersetEqual;": '\U00002289', + "NotTilde;": '\U00002241', + "NotTildeEqual;": '\U00002244', + "NotTildeFullEqual;": '\U00002247', + "NotTildeTilde;": '\U00002249', + "NotVerticalBar;": '\U00002224', + "Nscr;": '\U0001D4A9', + "Ntilde;": '\U000000D1', + "Nu;": '\U0000039D', + "OElig;": '\U00000152', + "Oacute;": '\U000000D3', + "Ocirc;": '\U000000D4', + "Ocy;": '\U0000041E', + "Odblac;": '\U00000150', + "Ofr;": '\U0001D512', + "Ograve;": '\U000000D2', + "Omacr;": '\U0000014C', + "Omega;": '\U000003A9', + "Omicron;": '\U0000039F', + "Oopf;": '\U0001D546', + "OpenCurlyDoubleQuote;": '\U0000201C', + "OpenCurlyQuote;": '\U00002018', + "Or;": '\U00002A54', + "Oscr;": '\U0001D4AA', + "Oslash;": '\U000000D8', + "Otilde;": '\U000000D5', + "Otimes;": '\U00002A37', + "Ouml;": '\U000000D6', + "OverBar;": '\U0000203E', + "OverBrace;": '\U000023DE', + "OverBracket;": '\U000023B4', + "OverParenthesis;": '\U000023DC', + "PartialD;": '\U00002202', + "Pcy;": '\U0000041F', + "Pfr;": '\U0001D513', + "Phi;": '\U000003A6', + "Pi;": '\U000003A0', + "PlusMinus;": '\U000000B1', + "Poincareplane;": '\U0000210C', + "Popf;": '\U00002119', + "Pr;": '\U00002ABB', + "Precedes;": '\U0000227A', + "PrecedesEqual;": '\U00002AAF', + "PrecedesSlantEqual;": '\U0000227C', + "PrecedesTilde;": '\U0000227E', + "Prime;": '\U00002033', + "Product;": '\U0000220F', + "Proportion;": '\U00002237', + "Proportional;": '\U0000221D', + "Pscr;": '\U0001D4AB', + "Psi;": '\U000003A8', + "QUOT;": '\U00000022', + "Qfr;": '\U0001D514', + "Qopf;": '\U0000211A', + "Qscr;": '\U0001D4AC', + "RBarr;": '\U00002910', + "REG;": '\U000000AE', + "Racute;": '\U00000154', + "Rang;": '\U000027EB', + "Rarr;": '\U000021A0', + "Rarrtl;": '\U00002916', + "Rcaron;": '\U00000158', + "Rcedil;": '\U00000156', + "Rcy;": '\U00000420', + "Re;": '\U0000211C', + "ReverseElement;": '\U0000220B', + "ReverseEquilibrium;": '\U000021CB', + "ReverseUpEquilibrium;": '\U0000296F', + "Rfr;": '\U0000211C', + "Rho;": '\U000003A1', + "RightAngleBracket;": '\U000027E9', + "RightArrow;": '\U00002192', + "RightArrowBar;": '\U000021E5', + "RightArrowLeftArrow;": '\U000021C4', + "RightCeiling;": '\U00002309', + "RightDoubleBracket;": '\U000027E7', + "RightDownTeeVector;": '\U0000295D', + "RightDownVector;": '\U000021C2', + "RightDownVectorBar;": '\U00002955', + "RightFloor;": '\U0000230B', + "RightTee;": '\U000022A2', + "RightTeeArrow;": '\U000021A6', + "RightTeeVector;": '\U0000295B', + "RightTriangle;": '\U000022B3', + "RightTriangleBar;": '\U000029D0', + "RightTriangleEqual;": '\U000022B5', + "RightUpDownVector;": '\U0000294F', + "RightUpTeeVector;": '\U0000295C', + "RightUpVector;": '\U000021BE', + "RightUpVectorBar;": '\U00002954', + "RightVector;": '\U000021C0', + "RightVectorBar;": '\U00002953', + "Rightarrow;": '\U000021D2', + "Ropf;": '\U0000211D', + "RoundImplies;": '\U00002970', + "Rrightarrow;": '\U000021DB', + "Rscr;": '\U0000211B', + "Rsh;": '\U000021B1', + "RuleDelayed;": '\U000029F4', + "SHCHcy;": '\U00000429', + "SHcy;": '\U00000428', + "SOFTcy;": '\U0000042C', + "Sacute;": '\U0000015A', + "Sc;": '\U00002ABC', + "Scaron;": '\U00000160', + "Scedil;": '\U0000015E', + "Scirc;": '\U0000015C', + "Scy;": '\U00000421', + "Sfr;": '\U0001D516', + "ShortDownArrow;": '\U00002193', + "ShortLeftArrow;": '\U00002190', + "ShortRightArrow;": '\U00002192', + "ShortUpArrow;": '\U00002191', + "Sigma;": '\U000003A3', + "SmallCircle;": '\U00002218', + "Sopf;": '\U0001D54A', + "Sqrt;": '\U0000221A', + "Square;": '\U000025A1', + "SquareIntersection;": '\U00002293', + "SquareSubset;": '\U0000228F', + "SquareSubsetEqual;": '\U00002291', + "SquareSuperset;": '\U00002290', + "SquareSupersetEqual;": '\U00002292', + "SquareUnion;": '\U00002294', + "Sscr;": '\U0001D4AE', + "Star;": '\U000022C6', + "Sub;": '\U000022D0', + "Subset;": '\U000022D0', + "SubsetEqual;": '\U00002286', + "Succeeds;": '\U0000227B', + "SucceedsEqual;": '\U00002AB0', + "SucceedsSlantEqual;": '\U0000227D', + "SucceedsTilde;": '\U0000227F', + "SuchThat;": '\U0000220B', + "Sum;": '\U00002211', + "Sup;": '\U000022D1', + "Superset;": '\U00002283', + "SupersetEqual;": '\U00002287', + "Supset;": '\U000022D1', + "THORN;": '\U000000DE', + "TRADE;": '\U00002122', + "TSHcy;": '\U0000040B', + "TScy;": '\U00000426', + "Tab;": '\U00000009', + "Tau;": '\U000003A4', + "Tcaron;": '\U00000164', + "Tcedil;": '\U00000162', + "Tcy;": '\U00000422', + "Tfr;": '\U0001D517', + "Therefore;": '\U00002234', + "Theta;": '\U00000398', + "ThinSpace;": '\U00002009', + "Tilde;": '\U0000223C', + "TildeEqual;": '\U00002243', + "TildeFullEqual;": '\U00002245', + "TildeTilde;": '\U00002248', + "Topf;": '\U0001D54B', + "TripleDot;": '\U000020DB', + "Tscr;": '\U0001D4AF', + "Tstrok;": '\U00000166', + "Uacute;": '\U000000DA', + "Uarr;": '\U0000219F', + "Uarrocir;": '\U00002949', + "Ubrcy;": '\U0000040E', + "Ubreve;": '\U0000016C', + "Ucirc;": '\U000000DB', + "Ucy;": '\U00000423', + "Udblac;": '\U00000170', + "Ufr;": '\U0001D518', + "Ugrave;": '\U000000D9', + "Umacr;": '\U0000016A', + "UnderBar;": '\U0000005F', + "UnderBrace;": '\U000023DF', + "UnderBracket;": '\U000023B5', + "UnderParenthesis;": '\U000023DD', + "Union;": '\U000022C3', + "UnionPlus;": '\U0000228E', + "Uogon;": '\U00000172', + "Uopf;": '\U0001D54C', + "UpArrow;": '\U00002191', + "UpArrowBar;": '\U00002912', + "UpArrowDownArrow;": '\U000021C5', + "UpDownArrow;": '\U00002195', + "UpEquilibrium;": '\U0000296E', + "UpTee;": '\U000022A5', + "UpTeeArrow;": '\U000021A5', + "Uparrow;": '\U000021D1', + "Updownarrow;": '\U000021D5', + "UpperLeftArrow;": '\U00002196', + "UpperRightArrow;": '\U00002197', + "Upsi;": '\U000003D2', + "Upsilon;": '\U000003A5', + "Uring;": '\U0000016E', + "Uscr;": '\U0001D4B0', + "Utilde;": '\U00000168', + "Uuml;": '\U000000DC', + "VDash;": '\U000022AB', + "Vbar;": '\U00002AEB', + "Vcy;": '\U00000412', + "Vdash;": '\U000022A9', + "Vdashl;": '\U00002AE6', + "Vee;": '\U000022C1', + "Verbar;": '\U00002016', + "Vert;": '\U00002016', + "VerticalBar;": '\U00002223', + "VerticalLine;": '\U0000007C', + "VerticalSeparator;": '\U00002758', + "VerticalTilde;": '\U00002240', + "VeryThinSpace;": '\U0000200A', + "Vfr;": '\U0001D519', + "Vopf;": '\U0001D54D', + "Vscr;": '\U0001D4B1', + "Vvdash;": '\U000022AA', + "Wcirc;": '\U00000174', + "Wedge;": '\U000022C0', + "Wfr;": '\U0001D51A', + "Wopf;": '\U0001D54E', + "Wscr;": '\U0001D4B2', + "Xfr;": '\U0001D51B', + "Xi;": '\U0000039E', + "Xopf;": '\U0001D54F', + "Xscr;": '\U0001D4B3', + "YAcy;": '\U0000042F', + "YIcy;": '\U00000407', + "YUcy;": '\U0000042E', + "Yacute;": '\U000000DD', + "Ycirc;": '\U00000176', + "Ycy;": '\U0000042B', + "Yfr;": '\U0001D51C', + "Yopf;": '\U0001D550', + "Yscr;": '\U0001D4B4', + "Yuml;": '\U00000178', + "ZHcy;": '\U00000416', + "Zacute;": '\U00000179', + "Zcaron;": '\U0000017D', + "Zcy;": '\U00000417', + "Zdot;": '\U0000017B', + "ZeroWidthSpace;": '\U0000200B', + "Zeta;": '\U00000396', + "Zfr;": '\U00002128', + "Zopf;": '\U00002124', + "Zscr;": '\U0001D4B5', + "aacute;": '\U000000E1', + "abreve;": '\U00000103', + "ac;": '\U0000223E', + "acd;": '\U0000223F', + "acirc;": '\U000000E2', + "acute;": '\U000000B4', + "acy;": '\U00000430', + "aelig;": '\U000000E6', + "af;": '\U00002061', + "afr;": '\U0001D51E', + "agrave;": '\U000000E0', + "alefsym;": '\U00002135', + "aleph;": '\U00002135', + "alpha;": '\U000003B1', + "amacr;": '\U00000101', + "amalg;": '\U00002A3F', + "amp;": '\U00000026', + "and;": '\U00002227', + "andand;": '\U00002A55', + "andd;": '\U00002A5C', + "andslope;": '\U00002A58', + "andv;": '\U00002A5A', + "ang;": '\U00002220', + "ange;": '\U000029A4', + "angle;": '\U00002220', + "angmsd;": '\U00002221', + "angmsdaa;": '\U000029A8', + "angmsdab;": '\U000029A9', + "angmsdac;": '\U000029AA', + "angmsdad;": '\U000029AB', + "angmsdae;": '\U000029AC', + "angmsdaf;": '\U000029AD', + "angmsdag;": '\U000029AE', + "angmsdah;": '\U000029AF', + "angrt;": '\U0000221F', + "angrtvb;": '\U000022BE', + "angrtvbd;": '\U0000299D', + "angsph;": '\U00002222', + "angst;": '\U000000C5', + "angzarr;": '\U0000237C', + "aogon;": '\U00000105', + "aopf;": '\U0001D552', + "ap;": '\U00002248', + "apE;": '\U00002A70', + "apacir;": '\U00002A6F', + "ape;": '\U0000224A', + "apid;": '\U0000224B', + "apos;": '\U00000027', + "approx;": '\U00002248', + "approxeq;": '\U0000224A', + "aring;": '\U000000E5', + "ascr;": '\U0001D4B6', + "ast;": '\U0000002A', + "asymp;": '\U00002248', + "asympeq;": '\U0000224D', + "atilde;": '\U000000E3', + "auml;": '\U000000E4', + "awconint;": '\U00002233', + "awint;": '\U00002A11', + "bNot;": '\U00002AED', + "backcong;": '\U0000224C', + "backepsilon;": '\U000003F6', + "backprime;": '\U00002035', + "backsim;": '\U0000223D', + "backsimeq;": '\U000022CD', + "barvee;": '\U000022BD', + "barwed;": '\U00002305', + "barwedge;": '\U00002305', + "bbrk;": '\U000023B5', + "bbrktbrk;": '\U000023B6', + "bcong;": '\U0000224C', + "bcy;": '\U00000431', + "bdquo;": '\U0000201E', + "becaus;": '\U00002235', + "because;": '\U00002235', + "bemptyv;": '\U000029B0', + "bepsi;": '\U000003F6', + "bernou;": '\U0000212C', + "beta;": '\U000003B2', + "beth;": '\U00002136', + "between;": '\U0000226C', + "bfr;": '\U0001D51F', + "bigcap;": '\U000022C2', + "bigcirc;": '\U000025EF', + "bigcup;": '\U000022C3', + "bigodot;": '\U00002A00', + "bigoplus;": '\U00002A01', + "bigotimes;": '\U00002A02', + "bigsqcup;": '\U00002A06', + "bigstar;": '\U00002605', + "bigtriangledown;": '\U000025BD', + "bigtriangleup;": '\U000025B3', + "biguplus;": '\U00002A04', + "bigvee;": '\U000022C1', + "bigwedge;": '\U000022C0', + "bkarow;": '\U0000290D', + "blacklozenge;": '\U000029EB', + "blacksquare;": '\U000025AA', + "blacktriangle;": '\U000025B4', + "blacktriangledown;": '\U000025BE', + "blacktriangleleft;": '\U000025C2', + "blacktriangleright;": '\U000025B8', + "blank;": '\U00002423', + "blk12;": '\U00002592', + "blk14;": '\U00002591', + "blk34;": '\U00002593', + "block;": '\U00002588', + "bnot;": '\U00002310', + "bopf;": '\U0001D553', + "bot;": '\U000022A5', + "bottom;": '\U000022A5', + "bowtie;": '\U000022C8', + "boxDL;": '\U00002557', + "boxDR;": '\U00002554', + "boxDl;": '\U00002556', + "boxDr;": '\U00002553', + "boxH;": '\U00002550', + "boxHD;": '\U00002566', + "boxHU;": '\U00002569', + "boxHd;": '\U00002564', + "boxHu;": '\U00002567', + "boxUL;": '\U0000255D', + "boxUR;": '\U0000255A', + "boxUl;": '\U0000255C', + "boxUr;": '\U00002559', + "boxV;": '\U00002551', + "boxVH;": '\U0000256C', + "boxVL;": '\U00002563', + "boxVR;": '\U00002560', + "boxVh;": '\U0000256B', + "boxVl;": '\U00002562', + "boxVr;": '\U0000255F', + "boxbox;": '\U000029C9', + "boxdL;": '\U00002555', + "boxdR;": '\U00002552', + "boxdl;": '\U00002510', + "boxdr;": '\U0000250C', + "boxh;": '\U00002500', + "boxhD;": '\U00002565', + "boxhU;": '\U00002568', + "boxhd;": '\U0000252C', + "boxhu;": '\U00002534', + "boxminus;": '\U0000229F', + "boxplus;": '\U0000229E', + "boxtimes;": '\U000022A0', + "boxuL;": '\U0000255B', + "boxuR;": '\U00002558', + "boxul;": '\U00002518', + "boxur;": '\U00002514', + "boxv;": '\U00002502', + "boxvH;": '\U0000256A', + "boxvL;": '\U00002561', + "boxvR;": '\U0000255E', + "boxvh;": '\U0000253C', + "boxvl;": '\U00002524', + "boxvr;": '\U0000251C', + "bprime;": '\U00002035', + "breve;": '\U000002D8', + "brvbar;": '\U000000A6', + "bscr;": '\U0001D4B7', + "bsemi;": '\U0000204F', + "bsim;": '\U0000223D', + "bsime;": '\U000022CD', + "bsol;": '\U0000005C', + "bsolb;": '\U000029C5', + "bsolhsub;": '\U000027C8', + "bull;": '\U00002022', + "bullet;": '\U00002022', + "bump;": '\U0000224E', + "bumpE;": '\U00002AAE', + "bumpe;": '\U0000224F', + "bumpeq;": '\U0000224F', + "cacute;": '\U00000107', + "cap;": '\U00002229', + "capand;": '\U00002A44', + "capbrcup;": '\U00002A49', + "capcap;": '\U00002A4B', + "capcup;": '\U00002A47', + "capdot;": '\U00002A40', + "caret;": '\U00002041', + "caron;": '\U000002C7', + "ccaps;": '\U00002A4D', + "ccaron;": '\U0000010D', + "ccedil;": '\U000000E7', + "ccirc;": '\U00000109', + "ccups;": '\U00002A4C', + "ccupssm;": '\U00002A50', + "cdot;": '\U0000010B', + "cedil;": '\U000000B8', + "cemptyv;": '\U000029B2', + "cent;": '\U000000A2', + "centerdot;": '\U000000B7', + "cfr;": '\U0001D520', + "chcy;": '\U00000447', + "check;": '\U00002713', + "checkmark;": '\U00002713', + "chi;": '\U000003C7', + "cir;": '\U000025CB', + "cirE;": '\U000029C3', + "circ;": '\U000002C6', + "circeq;": '\U00002257', + "circlearrowleft;": '\U000021BA', + "circlearrowright;": '\U000021BB', + "circledR;": '\U000000AE', + "circledS;": '\U000024C8', + "circledast;": '\U0000229B', + "circledcirc;": '\U0000229A', + "circleddash;": '\U0000229D', + "cire;": '\U00002257', + "cirfnint;": '\U00002A10', + "cirmid;": '\U00002AEF', + "cirscir;": '\U000029C2', + "clubs;": '\U00002663', + "clubsuit;": '\U00002663', + "colon;": '\U0000003A', + "colone;": '\U00002254', + "coloneq;": '\U00002254', + "comma;": '\U0000002C', + "commat;": '\U00000040', + "comp;": '\U00002201', + "compfn;": '\U00002218', + "complement;": '\U00002201', + "complexes;": '\U00002102', + "cong;": '\U00002245', + "congdot;": '\U00002A6D', + "conint;": '\U0000222E', + "copf;": '\U0001D554', + "coprod;": '\U00002210', + "copy;": '\U000000A9', + "copysr;": '\U00002117', + "crarr;": '\U000021B5', + "cross;": '\U00002717', + "cscr;": '\U0001D4B8', + "csub;": '\U00002ACF', + "csube;": '\U00002AD1', + "csup;": '\U00002AD0', + "csupe;": '\U00002AD2', + "ctdot;": '\U000022EF', + "cudarrl;": '\U00002938', + "cudarrr;": '\U00002935', + "cuepr;": '\U000022DE', + "cuesc;": '\U000022DF', + "cularr;": '\U000021B6', + "cularrp;": '\U0000293D', + "cup;": '\U0000222A', + "cupbrcap;": '\U00002A48', + "cupcap;": '\U00002A46', + "cupcup;": '\U00002A4A', + "cupdot;": '\U0000228D', + "cupor;": '\U00002A45', + "curarr;": '\U000021B7', + "curarrm;": '\U0000293C', + "curlyeqprec;": '\U000022DE', + "curlyeqsucc;": '\U000022DF', + "curlyvee;": '\U000022CE', + "curlywedge;": '\U000022CF', + "curren;": '\U000000A4', + "curvearrowleft;": '\U000021B6', + "curvearrowright;": '\U000021B7', + "cuvee;": '\U000022CE', + "cuwed;": '\U000022CF', + "cwconint;": '\U00002232', + "cwint;": '\U00002231', + "cylcty;": '\U0000232D', + "dArr;": '\U000021D3', + "dHar;": '\U00002965', + "dagger;": '\U00002020', + "daleth;": '\U00002138', + "darr;": '\U00002193', + "dash;": '\U00002010', + "dashv;": '\U000022A3', + "dbkarow;": '\U0000290F', + "dblac;": '\U000002DD', + "dcaron;": '\U0000010F', + "dcy;": '\U00000434', + "dd;": '\U00002146', + "ddagger;": '\U00002021', + "ddarr;": '\U000021CA', + "ddotseq;": '\U00002A77', + "deg;": '\U000000B0', + "delta;": '\U000003B4', + "demptyv;": '\U000029B1', + "dfisht;": '\U0000297F', + "dfr;": '\U0001D521', + "dharl;": '\U000021C3', + "dharr;": '\U000021C2', + "diam;": '\U000022C4', + "diamond;": '\U000022C4', + "diamondsuit;": '\U00002666', + "diams;": '\U00002666', + "die;": '\U000000A8', + "digamma;": '\U000003DD', + "disin;": '\U000022F2', + "div;": '\U000000F7', + "divide;": '\U000000F7', + "divideontimes;": '\U000022C7', + "divonx;": '\U000022C7', + "djcy;": '\U00000452', + "dlcorn;": '\U0000231E', + "dlcrop;": '\U0000230D', + "dollar;": '\U00000024', + "dopf;": '\U0001D555', + "dot;": '\U000002D9', + "doteq;": '\U00002250', + "doteqdot;": '\U00002251', + "dotminus;": '\U00002238', + "dotplus;": '\U00002214', + "dotsquare;": '\U000022A1', + "doublebarwedge;": '\U00002306', + "downarrow;": '\U00002193', + "downdownarrows;": '\U000021CA', + "downharpoonleft;": '\U000021C3', + "downharpoonright;": '\U000021C2', + "drbkarow;": '\U00002910', + "drcorn;": '\U0000231F', + "drcrop;": '\U0000230C', + "dscr;": '\U0001D4B9', + "dscy;": '\U00000455', + "dsol;": '\U000029F6', + "dstrok;": '\U00000111', + "dtdot;": '\U000022F1', + "dtri;": '\U000025BF', + "dtrif;": '\U000025BE', + "duarr;": '\U000021F5', + "duhar;": '\U0000296F', + "dwangle;": '\U000029A6', + "dzcy;": '\U0000045F', + "dzigrarr;": '\U000027FF', + "eDDot;": '\U00002A77', + "eDot;": '\U00002251', + "eacute;": '\U000000E9', + "easter;": '\U00002A6E', + "ecaron;": '\U0000011B', + "ecir;": '\U00002256', + "ecirc;": '\U000000EA', + "ecolon;": '\U00002255', + "ecy;": '\U0000044D', + "edot;": '\U00000117', + "ee;": '\U00002147', + "efDot;": '\U00002252', + "efr;": '\U0001D522', + "eg;": '\U00002A9A', + "egrave;": '\U000000E8', + "egs;": '\U00002A96', + "egsdot;": '\U00002A98', + "el;": '\U00002A99', + "elinters;": '\U000023E7', + "ell;": '\U00002113', + "els;": '\U00002A95', + "elsdot;": '\U00002A97', + "emacr;": '\U00000113', + "empty;": '\U00002205', + "emptyset;": '\U00002205', + "emptyv;": '\U00002205', + "emsp;": '\U00002003', + "emsp13;": '\U00002004', + "emsp14;": '\U00002005', + "eng;": '\U0000014B', + "ensp;": '\U00002002', + "eogon;": '\U00000119', + "eopf;": '\U0001D556', + "epar;": '\U000022D5', + "eparsl;": '\U000029E3', + "eplus;": '\U00002A71', + "epsi;": '\U000003B5', + "epsilon;": '\U000003B5', + "epsiv;": '\U000003F5', + "eqcirc;": '\U00002256', + "eqcolon;": '\U00002255', + "eqsim;": '\U00002242', + "eqslantgtr;": '\U00002A96', + "eqslantless;": '\U00002A95', + "equals;": '\U0000003D', + "equest;": '\U0000225F', + "equiv;": '\U00002261', + "equivDD;": '\U00002A78', + "eqvparsl;": '\U000029E5', + "erDot;": '\U00002253', + "erarr;": '\U00002971', + "escr;": '\U0000212F', + "esdot;": '\U00002250', + "esim;": '\U00002242', + "eta;": '\U000003B7', + "eth;": '\U000000F0', + "euml;": '\U000000EB', + "euro;": '\U000020AC', + "excl;": '\U00000021', + "exist;": '\U00002203', + "expectation;": '\U00002130', + "exponentiale;": '\U00002147', + "fallingdotseq;": '\U00002252', + "fcy;": '\U00000444', + "female;": '\U00002640', + "ffilig;": '\U0000FB03', + "fflig;": '\U0000FB00', + "ffllig;": '\U0000FB04', + "ffr;": '\U0001D523', + "filig;": '\U0000FB01', + "flat;": '\U0000266D', + "fllig;": '\U0000FB02', + "fltns;": '\U000025B1', + "fnof;": '\U00000192', + "fopf;": '\U0001D557', + "forall;": '\U00002200', + "fork;": '\U000022D4', + "forkv;": '\U00002AD9', + "fpartint;": '\U00002A0D', + "frac12;": '\U000000BD', + "frac13;": '\U00002153', + "frac14;": '\U000000BC', + "frac15;": '\U00002155', + "frac16;": '\U00002159', + "frac18;": '\U0000215B', + "frac23;": '\U00002154', + "frac25;": '\U00002156', + "frac34;": '\U000000BE', + "frac35;": '\U00002157', + "frac38;": '\U0000215C', + "frac45;": '\U00002158', + "frac56;": '\U0000215A', + "frac58;": '\U0000215D', + "frac78;": '\U0000215E', + "frasl;": '\U00002044', + "frown;": '\U00002322', + "fscr;": '\U0001D4BB', + "gE;": '\U00002267', + "gEl;": '\U00002A8C', + "gacute;": '\U000001F5', + "gamma;": '\U000003B3', + "gammad;": '\U000003DD', + "gap;": '\U00002A86', + "gbreve;": '\U0000011F', + "gcirc;": '\U0000011D', + "gcy;": '\U00000433', + "gdot;": '\U00000121', + "ge;": '\U00002265', + "gel;": '\U000022DB', + "geq;": '\U00002265', + "geqq;": '\U00002267', + "geqslant;": '\U00002A7E', + "ges;": '\U00002A7E', + "gescc;": '\U00002AA9', + "gesdot;": '\U00002A80', + "gesdoto;": '\U00002A82', + "gesdotol;": '\U00002A84', + "gesles;": '\U00002A94', + "gfr;": '\U0001D524', + "gg;": '\U0000226B', + "ggg;": '\U000022D9', + "gimel;": '\U00002137', + "gjcy;": '\U00000453', + "gl;": '\U00002277', + "glE;": '\U00002A92', + "gla;": '\U00002AA5', + "glj;": '\U00002AA4', + "gnE;": '\U00002269', + "gnap;": '\U00002A8A', + "gnapprox;": '\U00002A8A', + "gne;": '\U00002A88', + "gneq;": '\U00002A88', + "gneqq;": '\U00002269', + "gnsim;": '\U000022E7', + "gopf;": '\U0001D558', + "grave;": '\U00000060', + "gscr;": '\U0000210A', + "gsim;": '\U00002273', + "gsime;": '\U00002A8E', + "gsiml;": '\U00002A90', + "gt;": '\U0000003E', + "gtcc;": '\U00002AA7', + "gtcir;": '\U00002A7A', + "gtdot;": '\U000022D7', + "gtlPar;": '\U00002995', + "gtquest;": '\U00002A7C', + "gtrapprox;": '\U00002A86', + "gtrarr;": '\U00002978', + "gtrdot;": '\U000022D7', + "gtreqless;": '\U000022DB', + "gtreqqless;": '\U00002A8C', + "gtrless;": '\U00002277', + "gtrsim;": '\U00002273', + "hArr;": '\U000021D4', + "hairsp;": '\U0000200A', + "half;": '\U000000BD', + "hamilt;": '\U0000210B', + "hardcy;": '\U0000044A', + "harr;": '\U00002194', + "harrcir;": '\U00002948', + "harrw;": '\U000021AD', + "hbar;": '\U0000210F', + "hcirc;": '\U00000125', + "hearts;": '\U00002665', + "heartsuit;": '\U00002665', + "hellip;": '\U00002026', + "hercon;": '\U000022B9', + "hfr;": '\U0001D525', + "hksearow;": '\U00002925', + "hkswarow;": '\U00002926', + "hoarr;": '\U000021FF', + "homtht;": '\U0000223B', + "hookleftarrow;": '\U000021A9', + "hookrightarrow;": '\U000021AA', + "hopf;": '\U0001D559', + "horbar;": '\U00002015', + "hscr;": '\U0001D4BD', + "hslash;": '\U0000210F', + "hstrok;": '\U00000127', + "hybull;": '\U00002043', + "hyphen;": '\U00002010', + "iacute;": '\U000000ED', + "ic;": '\U00002063', + "icirc;": '\U000000EE', + "icy;": '\U00000438', + "iecy;": '\U00000435', + "iexcl;": '\U000000A1', + "iff;": '\U000021D4', + "ifr;": '\U0001D526', + "igrave;": '\U000000EC', + "ii;": '\U00002148', + "iiiint;": '\U00002A0C', + "iiint;": '\U0000222D', + "iinfin;": '\U000029DC', + "iiota;": '\U00002129', + "ijlig;": '\U00000133', + "imacr;": '\U0000012B', + "image;": '\U00002111', + "imagline;": '\U00002110', + "imagpart;": '\U00002111', + "imath;": '\U00000131', + "imof;": '\U000022B7', + "imped;": '\U000001B5', + "in;": '\U00002208', + "incare;": '\U00002105', + "infin;": '\U0000221E', + "infintie;": '\U000029DD', + "inodot;": '\U00000131', + "int;": '\U0000222B', + "intcal;": '\U000022BA', + "integers;": '\U00002124', + "intercal;": '\U000022BA', + "intlarhk;": '\U00002A17', + "intprod;": '\U00002A3C', + "iocy;": '\U00000451', + "iogon;": '\U0000012F', + "iopf;": '\U0001D55A', + "iota;": '\U000003B9', + "iprod;": '\U00002A3C', + "iquest;": '\U000000BF', + "iscr;": '\U0001D4BE', + "isin;": '\U00002208', + "isinE;": '\U000022F9', + "isindot;": '\U000022F5', + "isins;": '\U000022F4', + "isinsv;": '\U000022F3', + "isinv;": '\U00002208', + "it;": '\U00002062', + "itilde;": '\U00000129', + "iukcy;": '\U00000456', + "iuml;": '\U000000EF', + "jcirc;": '\U00000135', + "jcy;": '\U00000439', + "jfr;": '\U0001D527', + "jmath;": '\U00000237', + "jopf;": '\U0001D55B', + "jscr;": '\U0001D4BF', + "jsercy;": '\U00000458', + "jukcy;": '\U00000454', + "kappa;": '\U000003BA', + "kappav;": '\U000003F0', + "kcedil;": '\U00000137', + "kcy;": '\U0000043A', + "kfr;": '\U0001D528', + "kgreen;": '\U00000138', + "khcy;": '\U00000445', + "kjcy;": '\U0000045C', + "kopf;": '\U0001D55C', + "kscr;": '\U0001D4C0', + "lAarr;": '\U000021DA', + "lArr;": '\U000021D0', + "lAtail;": '\U0000291B', + "lBarr;": '\U0000290E', + "lE;": '\U00002266', + "lEg;": '\U00002A8B', + "lHar;": '\U00002962', + "lacute;": '\U0000013A', + "laemptyv;": '\U000029B4', + "lagran;": '\U00002112', + "lambda;": '\U000003BB', + "lang;": '\U000027E8', + "langd;": '\U00002991', + "langle;": '\U000027E8', + "lap;": '\U00002A85', + "laquo;": '\U000000AB', + "larr;": '\U00002190', + "larrb;": '\U000021E4', + "larrbfs;": '\U0000291F', + "larrfs;": '\U0000291D', + "larrhk;": '\U000021A9', + "larrlp;": '\U000021AB', + "larrpl;": '\U00002939', + "larrsim;": '\U00002973', + "larrtl;": '\U000021A2', + "lat;": '\U00002AAB', + "latail;": '\U00002919', + "late;": '\U00002AAD', + "lbarr;": '\U0000290C', + "lbbrk;": '\U00002772', + "lbrace;": '\U0000007B', + "lbrack;": '\U0000005B', + "lbrke;": '\U0000298B', + "lbrksld;": '\U0000298F', + "lbrkslu;": '\U0000298D', + "lcaron;": '\U0000013E', + "lcedil;": '\U0000013C', + "lceil;": '\U00002308', + "lcub;": '\U0000007B', + "lcy;": '\U0000043B', + "ldca;": '\U00002936', + "ldquo;": '\U0000201C', + "ldquor;": '\U0000201E', + "ldrdhar;": '\U00002967', + "ldrushar;": '\U0000294B', + "ldsh;": '\U000021B2', + "le;": '\U00002264', + "leftarrow;": '\U00002190', + "leftarrowtail;": '\U000021A2', + "leftharpoondown;": '\U000021BD', + "leftharpoonup;": '\U000021BC', + "leftleftarrows;": '\U000021C7', + "leftrightarrow;": '\U00002194', + "leftrightarrows;": '\U000021C6', + "leftrightharpoons;": '\U000021CB', + "leftrightsquigarrow;": '\U000021AD', + "leftthreetimes;": '\U000022CB', + "leg;": '\U000022DA', + "leq;": '\U00002264', + "leqq;": '\U00002266', + "leqslant;": '\U00002A7D', + "les;": '\U00002A7D', + "lescc;": '\U00002AA8', + "lesdot;": '\U00002A7F', + "lesdoto;": '\U00002A81', + "lesdotor;": '\U00002A83', + "lesges;": '\U00002A93', + "lessapprox;": '\U00002A85', + "lessdot;": '\U000022D6', + "lesseqgtr;": '\U000022DA', + "lesseqqgtr;": '\U00002A8B', + "lessgtr;": '\U00002276', + "lesssim;": '\U00002272', + "lfisht;": '\U0000297C', + "lfloor;": '\U0000230A', + "lfr;": '\U0001D529', + "lg;": '\U00002276', + "lgE;": '\U00002A91', + "lhard;": '\U000021BD', + "lharu;": '\U000021BC', + "lharul;": '\U0000296A', + "lhblk;": '\U00002584', + "ljcy;": '\U00000459', + "ll;": '\U0000226A', + "llarr;": '\U000021C7', + "llcorner;": '\U0000231E', + "llhard;": '\U0000296B', + "lltri;": '\U000025FA', + "lmidot;": '\U00000140', + "lmoust;": '\U000023B0', + "lmoustache;": '\U000023B0', + "lnE;": '\U00002268', + "lnap;": '\U00002A89', + "lnapprox;": '\U00002A89', + "lne;": '\U00002A87', + "lneq;": '\U00002A87', + "lneqq;": '\U00002268', + "lnsim;": '\U000022E6', + "loang;": '\U000027EC', + "loarr;": '\U000021FD', + "lobrk;": '\U000027E6', + "longleftarrow;": '\U000027F5', + "longleftrightarrow;": '\U000027F7', + "longmapsto;": '\U000027FC', + "longrightarrow;": '\U000027F6', + "looparrowleft;": '\U000021AB', + "looparrowright;": '\U000021AC', + "lopar;": '\U00002985', + "lopf;": '\U0001D55D', + "loplus;": '\U00002A2D', + "lotimes;": '\U00002A34', + "lowast;": '\U00002217', + "lowbar;": '\U0000005F', + "loz;": '\U000025CA', + "lozenge;": '\U000025CA', + "lozf;": '\U000029EB', + "lpar;": '\U00000028', + "lparlt;": '\U00002993', + "lrarr;": '\U000021C6', + "lrcorner;": '\U0000231F', + "lrhar;": '\U000021CB', + "lrhard;": '\U0000296D', + "lrm;": '\U0000200E', + "lrtri;": '\U000022BF', + "lsaquo;": '\U00002039', + "lscr;": '\U0001D4C1', + "lsh;": '\U000021B0', + "lsim;": '\U00002272', + "lsime;": '\U00002A8D', + "lsimg;": '\U00002A8F', + "lsqb;": '\U0000005B', + "lsquo;": '\U00002018', + "lsquor;": '\U0000201A', + "lstrok;": '\U00000142', + "lt;": '\U0000003C', + "ltcc;": '\U00002AA6', + "ltcir;": '\U00002A79', + "ltdot;": '\U000022D6', + "lthree;": '\U000022CB', + "ltimes;": '\U000022C9', + "ltlarr;": '\U00002976', + "ltquest;": '\U00002A7B', + "ltrPar;": '\U00002996', + "ltri;": '\U000025C3', + "ltrie;": '\U000022B4', + "ltrif;": '\U000025C2', + "lurdshar;": '\U0000294A', + "luruhar;": '\U00002966', + "mDDot;": '\U0000223A', + "macr;": '\U000000AF', + "male;": '\U00002642', + "malt;": '\U00002720', + "maltese;": '\U00002720', + "map;": '\U000021A6', + "mapsto;": '\U000021A6', + "mapstodown;": '\U000021A7', + "mapstoleft;": '\U000021A4', + "mapstoup;": '\U000021A5', + "marker;": '\U000025AE', + "mcomma;": '\U00002A29', + "mcy;": '\U0000043C', + "mdash;": '\U00002014', + "measuredangle;": '\U00002221', + "mfr;": '\U0001D52A', + "mho;": '\U00002127', + "micro;": '\U000000B5', + "mid;": '\U00002223', + "midast;": '\U0000002A', + "midcir;": '\U00002AF0', + "middot;": '\U000000B7', + "minus;": '\U00002212', + "minusb;": '\U0000229F', + "minusd;": '\U00002238', + "minusdu;": '\U00002A2A', + "mlcp;": '\U00002ADB', + "mldr;": '\U00002026', + "mnplus;": '\U00002213', + "models;": '\U000022A7', + "mopf;": '\U0001D55E', + "mp;": '\U00002213', + "mscr;": '\U0001D4C2', + "mstpos;": '\U0000223E', + "mu;": '\U000003BC', + "multimap;": '\U000022B8', + "mumap;": '\U000022B8', + "nLeftarrow;": '\U000021CD', + "nLeftrightarrow;": '\U000021CE', + "nRightarrow;": '\U000021CF', + "nVDash;": '\U000022AF', + "nVdash;": '\U000022AE', + "nabla;": '\U00002207', + "nacute;": '\U00000144', + "nap;": '\U00002249', + "napos;": '\U00000149', + "napprox;": '\U00002249', + "natur;": '\U0000266E', + "natural;": '\U0000266E', + "naturals;": '\U00002115', + "nbsp;": '\U000000A0', + "ncap;": '\U00002A43', + "ncaron;": '\U00000148', + "ncedil;": '\U00000146', + "ncong;": '\U00002247', + "ncup;": '\U00002A42', + "ncy;": '\U0000043D', + "ndash;": '\U00002013', + "ne;": '\U00002260', + "neArr;": '\U000021D7', + "nearhk;": '\U00002924', + "nearr;": '\U00002197', + "nearrow;": '\U00002197', + "nequiv;": '\U00002262', + "nesear;": '\U00002928', + "nexist;": '\U00002204', + "nexists;": '\U00002204', + "nfr;": '\U0001D52B', + "nge;": '\U00002271', + "ngeq;": '\U00002271', + "ngsim;": '\U00002275', + "ngt;": '\U0000226F', + "ngtr;": '\U0000226F', + "nhArr;": '\U000021CE', + "nharr;": '\U000021AE', + "nhpar;": '\U00002AF2', + "ni;": '\U0000220B', + "nis;": '\U000022FC', + "nisd;": '\U000022FA', + "niv;": '\U0000220B', + "njcy;": '\U0000045A', + "nlArr;": '\U000021CD', + "nlarr;": '\U0000219A', + "nldr;": '\U00002025', + "nle;": '\U00002270', + "nleftarrow;": '\U0000219A', + "nleftrightarrow;": '\U000021AE', + "nleq;": '\U00002270', + "nless;": '\U0000226E', + "nlsim;": '\U00002274', + "nlt;": '\U0000226E', + "nltri;": '\U000022EA', + "nltrie;": '\U000022EC', + "nmid;": '\U00002224', + "nopf;": '\U0001D55F', + "not;": '\U000000AC', + "notin;": '\U00002209', + "notinva;": '\U00002209', + "notinvb;": '\U000022F7', + "notinvc;": '\U000022F6', + "notni;": '\U0000220C', + "notniva;": '\U0000220C', + "notnivb;": '\U000022FE', + "notnivc;": '\U000022FD', + "npar;": '\U00002226', + "nparallel;": '\U00002226', + "npolint;": '\U00002A14', + "npr;": '\U00002280', + "nprcue;": '\U000022E0', + "nprec;": '\U00002280', + "nrArr;": '\U000021CF', + "nrarr;": '\U0000219B', + "nrightarrow;": '\U0000219B', + "nrtri;": '\U000022EB', + "nrtrie;": '\U000022ED', + "nsc;": '\U00002281', + "nsccue;": '\U000022E1', + "nscr;": '\U0001D4C3', + "nshortmid;": '\U00002224', + "nshortparallel;": '\U00002226', + "nsim;": '\U00002241', + "nsime;": '\U00002244', + "nsimeq;": '\U00002244', + "nsmid;": '\U00002224', + "nspar;": '\U00002226', + "nsqsube;": '\U000022E2', + "nsqsupe;": '\U000022E3', + "nsub;": '\U00002284', + "nsube;": '\U00002288', + "nsubseteq;": '\U00002288', + "nsucc;": '\U00002281', + "nsup;": '\U00002285', + "nsupe;": '\U00002289', + "nsupseteq;": '\U00002289', + "ntgl;": '\U00002279', + "ntilde;": '\U000000F1', + "ntlg;": '\U00002278', + "ntriangleleft;": '\U000022EA', + "ntrianglelefteq;": '\U000022EC', + "ntriangleright;": '\U000022EB', + "ntrianglerighteq;": '\U000022ED', + "nu;": '\U000003BD', + "num;": '\U00000023', + "numero;": '\U00002116', + "numsp;": '\U00002007', + "nvDash;": '\U000022AD', + "nvHarr;": '\U00002904', + "nvdash;": '\U000022AC', + "nvinfin;": '\U000029DE', + "nvlArr;": '\U00002902', + "nvrArr;": '\U00002903', + "nwArr;": '\U000021D6', + "nwarhk;": '\U00002923', + "nwarr;": '\U00002196', + "nwarrow;": '\U00002196', + "nwnear;": '\U00002927', + "oS;": '\U000024C8', + "oacute;": '\U000000F3', + "oast;": '\U0000229B', + "ocir;": '\U0000229A', + "ocirc;": '\U000000F4', + "ocy;": '\U0000043E', + "odash;": '\U0000229D', + "odblac;": '\U00000151', + "odiv;": '\U00002A38', + "odot;": '\U00002299', + "odsold;": '\U000029BC', + "oelig;": '\U00000153', + "ofcir;": '\U000029BF', + "ofr;": '\U0001D52C', + "ogon;": '\U000002DB', + "ograve;": '\U000000F2', + "ogt;": '\U000029C1', + "ohbar;": '\U000029B5', + "ohm;": '\U000003A9', + "oint;": '\U0000222E', + "olarr;": '\U000021BA', + "olcir;": '\U000029BE', + "olcross;": '\U000029BB', + "oline;": '\U0000203E', + "olt;": '\U000029C0', + "omacr;": '\U0000014D', + "omega;": '\U000003C9', + "omicron;": '\U000003BF', + "omid;": '\U000029B6', + "ominus;": '\U00002296', + "oopf;": '\U0001D560', + "opar;": '\U000029B7', + "operp;": '\U000029B9', + "oplus;": '\U00002295', + "or;": '\U00002228', + "orarr;": '\U000021BB', + "ord;": '\U00002A5D', + "order;": '\U00002134', + "orderof;": '\U00002134', + "ordf;": '\U000000AA', + "ordm;": '\U000000BA', + "origof;": '\U000022B6', + "oror;": '\U00002A56', + "orslope;": '\U00002A57', + "orv;": '\U00002A5B', + "oscr;": '\U00002134', + "oslash;": '\U000000F8', + "osol;": '\U00002298', + "otilde;": '\U000000F5', + "otimes;": '\U00002297', + "otimesas;": '\U00002A36', + "ouml;": '\U000000F6', + "ovbar;": '\U0000233D', + "par;": '\U00002225', + "para;": '\U000000B6', + "parallel;": '\U00002225', + "parsim;": '\U00002AF3', + "parsl;": '\U00002AFD', + "part;": '\U00002202', + "pcy;": '\U0000043F', + "percnt;": '\U00000025', + "period;": '\U0000002E', + "permil;": '\U00002030', + "perp;": '\U000022A5', + "pertenk;": '\U00002031', + "pfr;": '\U0001D52D', + "phi;": '\U000003C6', + "phiv;": '\U000003D5', + "phmmat;": '\U00002133', + "phone;": '\U0000260E', + "pi;": '\U000003C0', + "pitchfork;": '\U000022D4', + "piv;": '\U000003D6', + "planck;": '\U0000210F', + "planckh;": '\U0000210E', + "plankv;": '\U0000210F', + "plus;": '\U0000002B', + "plusacir;": '\U00002A23', + "plusb;": '\U0000229E', + "pluscir;": '\U00002A22', + "plusdo;": '\U00002214', + "plusdu;": '\U00002A25', + "pluse;": '\U00002A72', + "plusmn;": '\U000000B1', + "plussim;": '\U00002A26', + "plustwo;": '\U00002A27', + "pm;": '\U000000B1', + "pointint;": '\U00002A15', + "popf;": '\U0001D561', + "pound;": '\U000000A3', + "pr;": '\U0000227A', + "prE;": '\U00002AB3', + "prap;": '\U00002AB7', + "prcue;": '\U0000227C', + "pre;": '\U00002AAF', + "prec;": '\U0000227A', + "precapprox;": '\U00002AB7', + "preccurlyeq;": '\U0000227C', + "preceq;": '\U00002AAF', + "precnapprox;": '\U00002AB9', + "precneqq;": '\U00002AB5', + "precnsim;": '\U000022E8', + "precsim;": '\U0000227E', + "prime;": '\U00002032', + "primes;": '\U00002119', + "prnE;": '\U00002AB5', + "prnap;": '\U00002AB9', + "prnsim;": '\U000022E8', + "prod;": '\U0000220F', + "profalar;": '\U0000232E', + "profline;": '\U00002312', + "profsurf;": '\U00002313', + "prop;": '\U0000221D', + "propto;": '\U0000221D', + "prsim;": '\U0000227E', + "prurel;": '\U000022B0', + "pscr;": '\U0001D4C5', + "psi;": '\U000003C8', + "puncsp;": '\U00002008', + "qfr;": '\U0001D52E', + "qint;": '\U00002A0C', + "qopf;": '\U0001D562', + "qprime;": '\U00002057', + "qscr;": '\U0001D4C6', + "quaternions;": '\U0000210D', + "quatint;": '\U00002A16', + "quest;": '\U0000003F', + "questeq;": '\U0000225F', + "quot;": '\U00000022', + "rAarr;": '\U000021DB', + "rArr;": '\U000021D2', + "rAtail;": '\U0000291C', + "rBarr;": '\U0000290F', + "rHar;": '\U00002964', + "racute;": '\U00000155', + "radic;": '\U0000221A', + "raemptyv;": '\U000029B3', + "rang;": '\U000027E9', + "rangd;": '\U00002992', + "range;": '\U000029A5', + "rangle;": '\U000027E9', + "raquo;": '\U000000BB', + "rarr;": '\U00002192', + "rarrap;": '\U00002975', + "rarrb;": '\U000021E5', + "rarrbfs;": '\U00002920', + "rarrc;": '\U00002933', + "rarrfs;": '\U0000291E', + "rarrhk;": '\U000021AA', + "rarrlp;": '\U000021AC', + "rarrpl;": '\U00002945', + "rarrsim;": '\U00002974', + "rarrtl;": '\U000021A3', + "rarrw;": '\U0000219D', + "ratail;": '\U0000291A', + "ratio;": '\U00002236', + "rationals;": '\U0000211A', + "rbarr;": '\U0000290D', + "rbbrk;": '\U00002773', + "rbrace;": '\U0000007D', + "rbrack;": '\U0000005D', + "rbrke;": '\U0000298C', + "rbrksld;": '\U0000298E', + "rbrkslu;": '\U00002990', + "rcaron;": '\U00000159', + "rcedil;": '\U00000157', + "rceil;": '\U00002309', + "rcub;": '\U0000007D', + "rcy;": '\U00000440', + "rdca;": '\U00002937', + "rdldhar;": '\U00002969', + "rdquo;": '\U0000201D', + "rdquor;": '\U0000201D', + "rdsh;": '\U000021B3', + "real;": '\U0000211C', + "realine;": '\U0000211B', + "realpart;": '\U0000211C', + "reals;": '\U0000211D', + "rect;": '\U000025AD', + "reg;": '\U000000AE', + "rfisht;": '\U0000297D', + "rfloor;": '\U0000230B', + "rfr;": '\U0001D52F', + "rhard;": '\U000021C1', + "rharu;": '\U000021C0', + "rharul;": '\U0000296C', + "rho;": '\U000003C1', + "rhov;": '\U000003F1', + "rightarrow;": '\U00002192', + "rightarrowtail;": '\U000021A3', + "rightharpoondown;": '\U000021C1', + "rightharpoonup;": '\U000021C0', + "rightleftarrows;": '\U000021C4', + "rightleftharpoons;": '\U000021CC', + "rightrightarrows;": '\U000021C9', + "rightsquigarrow;": '\U0000219D', + "rightthreetimes;": '\U000022CC', + "ring;": '\U000002DA', + "risingdotseq;": '\U00002253', + "rlarr;": '\U000021C4', + "rlhar;": '\U000021CC', + "rlm;": '\U0000200F', + "rmoust;": '\U000023B1', + "rmoustache;": '\U000023B1', + "rnmid;": '\U00002AEE', + "roang;": '\U000027ED', + "roarr;": '\U000021FE', + "robrk;": '\U000027E7', + "ropar;": '\U00002986', + "ropf;": '\U0001D563', + "roplus;": '\U00002A2E', + "rotimes;": '\U00002A35', + "rpar;": '\U00000029', + "rpargt;": '\U00002994', + "rppolint;": '\U00002A12', + "rrarr;": '\U000021C9', + "rsaquo;": '\U0000203A', + "rscr;": '\U0001D4C7', + "rsh;": '\U000021B1', + "rsqb;": '\U0000005D', + "rsquo;": '\U00002019', + "rsquor;": '\U00002019', + "rthree;": '\U000022CC', + "rtimes;": '\U000022CA', + "rtri;": '\U000025B9', + "rtrie;": '\U000022B5', + "rtrif;": '\U000025B8', + "rtriltri;": '\U000029CE', + "ruluhar;": '\U00002968', + "rx;": '\U0000211E', + "sacute;": '\U0000015B', + "sbquo;": '\U0000201A', + "sc;": '\U0000227B', + "scE;": '\U00002AB4', + "scap;": '\U00002AB8', + "scaron;": '\U00000161', + "sccue;": '\U0000227D', + "sce;": '\U00002AB0', + "scedil;": '\U0000015F', + "scirc;": '\U0000015D', + "scnE;": '\U00002AB6', + "scnap;": '\U00002ABA', + "scnsim;": '\U000022E9', + "scpolint;": '\U00002A13', + "scsim;": '\U0000227F', + "scy;": '\U00000441', + "sdot;": '\U000022C5', + "sdotb;": '\U000022A1', + "sdote;": '\U00002A66', + "seArr;": '\U000021D8', + "searhk;": '\U00002925', + "searr;": '\U00002198', + "searrow;": '\U00002198', + "sect;": '\U000000A7', + "semi;": '\U0000003B', + "seswar;": '\U00002929', + "setminus;": '\U00002216', + "setmn;": '\U00002216', + "sext;": '\U00002736', + "sfr;": '\U0001D530', + "sfrown;": '\U00002322', + "sharp;": '\U0000266F', + "shchcy;": '\U00000449', + "shcy;": '\U00000448', + "shortmid;": '\U00002223', + "shortparallel;": '\U00002225', + "shy;": '\U000000AD', + "sigma;": '\U000003C3', + "sigmaf;": '\U000003C2', + "sigmav;": '\U000003C2', + "sim;": '\U0000223C', + "simdot;": '\U00002A6A', + "sime;": '\U00002243', + "simeq;": '\U00002243', + "simg;": '\U00002A9E', + "simgE;": '\U00002AA0', + "siml;": '\U00002A9D', + "simlE;": '\U00002A9F', + "simne;": '\U00002246', + "simplus;": '\U00002A24', + "simrarr;": '\U00002972', + "slarr;": '\U00002190', + "smallsetminus;": '\U00002216', + "smashp;": '\U00002A33', + "smeparsl;": '\U000029E4', + "smid;": '\U00002223', + "smile;": '\U00002323', + "smt;": '\U00002AAA', + "smte;": '\U00002AAC', + "softcy;": '\U0000044C', + "sol;": '\U0000002F', + "solb;": '\U000029C4', + "solbar;": '\U0000233F', + "sopf;": '\U0001D564', + "spades;": '\U00002660', + "spadesuit;": '\U00002660', + "spar;": '\U00002225', + "sqcap;": '\U00002293', + "sqcup;": '\U00002294', + "sqsub;": '\U0000228F', + "sqsube;": '\U00002291', + "sqsubset;": '\U0000228F', + "sqsubseteq;": '\U00002291', + "sqsup;": '\U00002290', + "sqsupe;": '\U00002292', + "sqsupset;": '\U00002290', + "sqsupseteq;": '\U00002292', + "squ;": '\U000025A1', + "square;": '\U000025A1', + "squarf;": '\U000025AA', + "squf;": '\U000025AA', + "srarr;": '\U00002192', + "sscr;": '\U0001D4C8', + "ssetmn;": '\U00002216', + "ssmile;": '\U00002323', + "sstarf;": '\U000022C6', + "star;": '\U00002606', + "starf;": '\U00002605', + "straightepsilon;": '\U000003F5', + "straightphi;": '\U000003D5', + "strns;": '\U000000AF', + "sub;": '\U00002282', + "subE;": '\U00002AC5', + "subdot;": '\U00002ABD', + "sube;": '\U00002286', + "subedot;": '\U00002AC3', + "submult;": '\U00002AC1', + "subnE;": '\U00002ACB', + "subne;": '\U0000228A', + "subplus;": '\U00002ABF', + "subrarr;": '\U00002979', + "subset;": '\U00002282', + "subseteq;": '\U00002286', + "subseteqq;": '\U00002AC5', + "subsetneq;": '\U0000228A', + "subsetneqq;": '\U00002ACB', + "subsim;": '\U00002AC7', + "subsub;": '\U00002AD5', + "subsup;": '\U00002AD3', + "succ;": '\U0000227B', + "succapprox;": '\U00002AB8', + "succcurlyeq;": '\U0000227D', + "succeq;": '\U00002AB0', + "succnapprox;": '\U00002ABA', + "succneqq;": '\U00002AB6', + "succnsim;": '\U000022E9', + "succsim;": '\U0000227F', + "sum;": '\U00002211', + "sung;": '\U0000266A', + "sup;": '\U00002283', + "sup1;": '\U000000B9', + "sup2;": '\U000000B2', + "sup3;": '\U000000B3', + "supE;": '\U00002AC6', + "supdot;": '\U00002ABE', + "supdsub;": '\U00002AD8', + "supe;": '\U00002287', + "supedot;": '\U00002AC4', + "suphsol;": '\U000027C9', + "suphsub;": '\U00002AD7', + "suplarr;": '\U0000297B', + "supmult;": '\U00002AC2', + "supnE;": '\U00002ACC', + "supne;": '\U0000228B', + "supplus;": '\U00002AC0', + "supset;": '\U00002283', + "supseteq;": '\U00002287', + "supseteqq;": '\U00002AC6', + "supsetneq;": '\U0000228B', + "supsetneqq;": '\U00002ACC', + "supsim;": '\U00002AC8', + "supsub;": '\U00002AD4', + "supsup;": '\U00002AD6', + "swArr;": '\U000021D9', + "swarhk;": '\U00002926', + "swarr;": '\U00002199', + "swarrow;": '\U00002199', + "swnwar;": '\U0000292A', + "szlig;": '\U000000DF', + "target;": '\U00002316', + "tau;": '\U000003C4', + "tbrk;": '\U000023B4', + "tcaron;": '\U00000165', + "tcedil;": '\U00000163', + "tcy;": '\U00000442', + "tdot;": '\U000020DB', + "telrec;": '\U00002315', + "tfr;": '\U0001D531', + "there4;": '\U00002234', + "therefore;": '\U00002234', + "theta;": '\U000003B8', + "thetasym;": '\U000003D1', + "thetav;": '\U000003D1', + "thickapprox;": '\U00002248', + "thicksim;": '\U0000223C', + "thinsp;": '\U00002009', + "thkap;": '\U00002248', + "thksim;": '\U0000223C', + "thorn;": '\U000000FE', + "tilde;": '\U000002DC', + "times;": '\U000000D7', + "timesb;": '\U000022A0', + "timesbar;": '\U00002A31', + "timesd;": '\U00002A30', + "tint;": '\U0000222D', + "toea;": '\U00002928', + "top;": '\U000022A4', + "topbot;": '\U00002336', + "topcir;": '\U00002AF1', + "topf;": '\U0001D565', + "topfork;": '\U00002ADA', + "tosa;": '\U00002929', + "tprime;": '\U00002034', + "trade;": '\U00002122', + "triangle;": '\U000025B5', + "triangledown;": '\U000025BF', + "triangleleft;": '\U000025C3', + "trianglelefteq;": '\U000022B4', + "triangleq;": '\U0000225C', + "triangleright;": '\U000025B9', + "trianglerighteq;": '\U000022B5', + "tridot;": '\U000025EC', + "trie;": '\U0000225C', + "triminus;": '\U00002A3A', + "triplus;": '\U00002A39', + "trisb;": '\U000029CD', + "tritime;": '\U00002A3B', + "trpezium;": '\U000023E2', + "tscr;": '\U0001D4C9', + "tscy;": '\U00000446', + "tshcy;": '\U0000045B', + "tstrok;": '\U00000167', + "twixt;": '\U0000226C', + "twoheadleftarrow;": '\U0000219E', + "twoheadrightarrow;": '\U000021A0', + "uArr;": '\U000021D1', + "uHar;": '\U00002963', + "uacute;": '\U000000FA', + "uarr;": '\U00002191', + "ubrcy;": '\U0000045E', + "ubreve;": '\U0000016D', + "ucirc;": '\U000000FB', + "ucy;": '\U00000443', + "udarr;": '\U000021C5', + "udblac;": '\U00000171', + "udhar;": '\U0000296E', + "ufisht;": '\U0000297E', + "ufr;": '\U0001D532', + "ugrave;": '\U000000F9', + "uharl;": '\U000021BF', + "uharr;": '\U000021BE', + "uhblk;": '\U00002580', + "ulcorn;": '\U0000231C', + "ulcorner;": '\U0000231C', + "ulcrop;": '\U0000230F', + "ultri;": '\U000025F8', + "umacr;": '\U0000016B', + "uml;": '\U000000A8', + "uogon;": '\U00000173', + "uopf;": '\U0001D566', + "uparrow;": '\U00002191', + "updownarrow;": '\U00002195', + "upharpoonleft;": '\U000021BF', + "upharpoonright;": '\U000021BE', + "uplus;": '\U0000228E', + "upsi;": '\U000003C5', + "upsih;": '\U000003D2', + "upsilon;": '\U000003C5', + "upuparrows;": '\U000021C8', + "urcorn;": '\U0000231D', + "urcorner;": '\U0000231D', + "urcrop;": '\U0000230E', + "uring;": '\U0000016F', + "urtri;": '\U000025F9', + "uscr;": '\U0001D4CA', + "utdot;": '\U000022F0', + "utilde;": '\U00000169', + "utri;": '\U000025B5', + "utrif;": '\U000025B4', + "uuarr;": '\U000021C8', + "uuml;": '\U000000FC', + "uwangle;": '\U000029A7', + "vArr;": '\U000021D5', + "vBar;": '\U00002AE8', + "vBarv;": '\U00002AE9', + "vDash;": '\U000022A8', + "vangrt;": '\U0000299C', + "varepsilon;": '\U000003F5', + "varkappa;": '\U000003F0', + "varnothing;": '\U00002205', + "varphi;": '\U000003D5', + "varpi;": '\U000003D6', + "varpropto;": '\U0000221D', + "varr;": '\U00002195', + "varrho;": '\U000003F1', + "varsigma;": '\U000003C2', + "vartheta;": '\U000003D1', + "vartriangleleft;": '\U000022B2', + "vartriangleright;": '\U000022B3', + "vcy;": '\U00000432', + "vdash;": '\U000022A2', + "vee;": '\U00002228', + "veebar;": '\U000022BB', + "veeeq;": '\U0000225A', + "vellip;": '\U000022EE', + "verbar;": '\U0000007C', + "vert;": '\U0000007C', + "vfr;": '\U0001D533', + "vltri;": '\U000022B2', + "vopf;": '\U0001D567', + "vprop;": '\U0000221D', + "vrtri;": '\U000022B3', + "vscr;": '\U0001D4CB', + "vzigzag;": '\U0000299A', + "wcirc;": '\U00000175', + "wedbar;": '\U00002A5F', + "wedge;": '\U00002227', + "wedgeq;": '\U00002259', + "weierp;": '\U00002118', + "wfr;": '\U0001D534', + "wopf;": '\U0001D568', + "wp;": '\U00002118', + "wr;": '\U00002240', + "wreath;": '\U00002240', + "wscr;": '\U0001D4CC', + "xcap;": '\U000022C2', + "xcirc;": '\U000025EF', + "xcup;": '\U000022C3', + "xdtri;": '\U000025BD', + "xfr;": '\U0001D535', + "xhArr;": '\U000027FA', + "xharr;": '\U000027F7', + "xi;": '\U000003BE', + "xlArr;": '\U000027F8', + "xlarr;": '\U000027F5', + "xmap;": '\U000027FC', + "xnis;": '\U000022FB', + "xodot;": '\U00002A00', + "xopf;": '\U0001D569', + "xoplus;": '\U00002A01', + "xotime;": '\U00002A02', + "xrArr;": '\U000027F9', + "xrarr;": '\U000027F6', + "xscr;": '\U0001D4CD', + "xsqcup;": '\U00002A06', + "xuplus;": '\U00002A04', + "xutri;": '\U000025B3', + "xvee;": '\U000022C1', + "xwedge;": '\U000022C0', + "yacute;": '\U000000FD', + "yacy;": '\U0000044F', + "ycirc;": '\U00000177', + "ycy;": '\U0000044B', + "yen;": '\U000000A5', + "yfr;": '\U0001D536', + "yicy;": '\U00000457', + "yopf;": '\U0001D56A', + "yscr;": '\U0001D4CE', + "yucy;": '\U0000044E', + "yuml;": '\U000000FF', + "zacute;": '\U0000017A', + "zcaron;": '\U0000017E', + "zcy;": '\U00000437', + "zdot;": '\U0000017C', + "zeetrf;": '\U00002128', + "zeta;": '\U000003B6', + "zfr;": '\U0001D537', + "zhcy;": '\U00000436', + "zigrarr;": '\U000021DD', + "zopf;": '\U0001D56B', + "zscr;": '\U0001D4CF', + "zwj;": '\U0000200D', + "zwnj;": '\U0000200C', + "AElig": '\U000000C6', + "AMP": '\U00000026', + "Aacute": '\U000000C1', + "Acirc": '\U000000C2', + "Agrave": '\U000000C0', + "Aring": '\U000000C5', + "Atilde": '\U000000C3', + "Auml": '\U000000C4', + "COPY": '\U000000A9', + "Ccedil": '\U000000C7', + "ETH": '\U000000D0', + "Eacute": '\U000000C9', + "Ecirc": '\U000000CA', + "Egrave": '\U000000C8', + "Euml": '\U000000CB', + "GT": '\U0000003E', + "Iacute": '\U000000CD', + "Icirc": '\U000000CE', + "Igrave": '\U000000CC', + "Iuml": '\U000000CF', + "LT": '\U0000003C', + "Ntilde": '\U000000D1', + "Oacute": '\U000000D3', + "Ocirc": '\U000000D4', + "Ograve": '\U000000D2', + "Oslash": '\U000000D8', + "Otilde": '\U000000D5', + "Ouml": '\U000000D6', + "QUOT": '\U00000022', + "REG": '\U000000AE', + "THORN": '\U000000DE', + "Uacute": '\U000000DA', + "Ucirc": '\U000000DB', + "Ugrave": '\U000000D9', + "Uuml": '\U000000DC', + "Yacute": '\U000000DD', + "aacute": '\U000000E1', + "acirc": '\U000000E2', + "acute": '\U000000B4', + "aelig": '\U000000E6', + "agrave": '\U000000E0', + "amp": '\U00000026', + "aring": '\U000000E5', + "atilde": '\U000000E3', + "auml": '\U000000E4', + "brvbar": '\U000000A6', + "ccedil": '\U000000E7', + "cedil": '\U000000B8', + "cent": '\U000000A2', + "copy": '\U000000A9', + "curren": '\U000000A4', + "deg": '\U000000B0', + "divide": '\U000000F7', + "eacute": '\U000000E9', + "ecirc": '\U000000EA', + "egrave": '\U000000E8', + "eth": '\U000000F0', + "euml": '\U000000EB', + "frac12": '\U000000BD', + "frac14": '\U000000BC', + "frac34": '\U000000BE', + "gt": '\U0000003E', + "iacute": '\U000000ED', + "icirc": '\U000000EE', + "iexcl": '\U000000A1', + "igrave": '\U000000EC', + "iquest": '\U000000BF', + "iuml": '\U000000EF', + "laquo": '\U000000AB', + "lt": '\U0000003C', + "macr": '\U000000AF', + "micro": '\U000000B5', + "middot": '\U000000B7', + "nbsp": '\U000000A0', + "not": '\U000000AC', + "ntilde": '\U000000F1', + "oacute": '\U000000F3', + "ocirc": '\U000000F4', + "ograve": '\U000000F2', + "ordf": '\U000000AA', + "ordm": '\U000000BA', + "oslash": '\U000000F8', + "otilde": '\U000000F5', + "ouml": '\U000000F6', + "para": '\U000000B6', + "plusmn": '\U000000B1', + "pound": '\U000000A3', + "quot": '\U00000022', + "raquo": '\U000000BB', + "reg": '\U000000AE', + "sect": '\U000000A7', + "shy": '\U000000AD', + "sup1": '\U000000B9', + "sup2": '\U000000B2', + "sup3": '\U000000B3', + "szlig": '\U000000DF', + "thorn": '\U000000FE', + "times": '\U000000D7', + "uacute": '\U000000FA', + "ucirc": '\U000000FB', + "ugrave": '\U000000F9', + "uml": '\U000000A8', + "uuml": '\U000000FC', + "yacute": '\U000000FD', + "yen": '\U000000A5', + "yuml": '\U000000FF', +} + +// HTML entities that are two unicode codepoints. +var entity2 = map[string][2]rune{ + // TODO(nigeltao): Handle replacements that are wider than their names. + // "nLt;": {'\u226A', '\u20D2'}, + // "nGt;": {'\u226B', '\u20D2'}, + "NotEqualTilde;": {'\u2242', '\u0338'}, + "NotGreaterFullEqual;": {'\u2267', '\u0338'}, + "NotGreaterGreater;": {'\u226B', '\u0338'}, + "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, + "NotHumpDownHump;": {'\u224E', '\u0338'}, + "NotHumpEqual;": {'\u224F', '\u0338'}, + "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, + "NotLessLess;": {'\u226A', '\u0338'}, + "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, + "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, + "NotNestedLessLess;": {'\u2AA1', '\u0338'}, + "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, + "NotRightTriangleBar;": {'\u29D0', '\u0338'}, + "NotSquareSubset;": {'\u228F', '\u0338'}, + "NotSquareSuperset;": {'\u2290', '\u0338'}, + "NotSubset;": {'\u2282', '\u20D2'}, + "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, + "NotSucceedsTilde;": {'\u227F', '\u0338'}, + "NotSuperset;": {'\u2283', '\u20D2'}, + "ThickSpace;": {'\u205F', '\u200A'}, + "acE;": {'\u223E', '\u0333'}, + "bne;": {'\u003D', '\u20E5'}, + "bnequiv;": {'\u2261', '\u20E5'}, + "caps;": {'\u2229', '\uFE00'}, + "cups;": {'\u222A', '\uFE00'}, + "fjlig;": {'\u0066', '\u006A'}, + "gesl;": {'\u22DB', '\uFE00'}, + "gvertneqq;": {'\u2269', '\uFE00'}, + "gvnE;": {'\u2269', '\uFE00'}, + "lates;": {'\u2AAD', '\uFE00'}, + "lesg;": {'\u22DA', '\uFE00'}, + "lvertneqq;": {'\u2268', '\uFE00'}, + "lvnE;": {'\u2268', '\uFE00'}, + "nGg;": {'\u22D9', '\u0338'}, + "nGtv;": {'\u226B', '\u0338'}, + "nLl;": {'\u22D8', '\u0338'}, + "nLtv;": {'\u226A', '\u0338'}, + "nang;": {'\u2220', '\u20D2'}, + "napE;": {'\u2A70', '\u0338'}, + "napid;": {'\u224B', '\u0338'}, + "nbump;": {'\u224E', '\u0338'}, + "nbumpe;": {'\u224F', '\u0338'}, + "ncongdot;": {'\u2A6D', '\u0338'}, + "nedot;": {'\u2250', '\u0338'}, + "nesim;": {'\u2242', '\u0338'}, + "ngE;": {'\u2267', '\u0338'}, + "ngeqq;": {'\u2267', '\u0338'}, + "ngeqslant;": {'\u2A7E', '\u0338'}, + "nges;": {'\u2A7E', '\u0338'}, + "nlE;": {'\u2266', '\u0338'}, + "nleqq;": {'\u2266', '\u0338'}, + "nleqslant;": {'\u2A7D', '\u0338'}, + "nles;": {'\u2A7D', '\u0338'}, + "notinE;": {'\u22F9', '\u0338'}, + "notindot;": {'\u22F5', '\u0338'}, + "nparsl;": {'\u2AFD', '\u20E5'}, + "npart;": {'\u2202', '\u0338'}, + "npre;": {'\u2AAF', '\u0338'}, + "npreceq;": {'\u2AAF', '\u0338'}, + "nrarrc;": {'\u2933', '\u0338'}, + "nrarrw;": {'\u219D', '\u0338'}, + "nsce;": {'\u2AB0', '\u0338'}, + "nsubE;": {'\u2AC5', '\u0338'}, + "nsubset;": {'\u2282', '\u20D2'}, + "nsubseteqq;": {'\u2AC5', '\u0338'}, + "nsucceq;": {'\u2AB0', '\u0338'}, + "nsupE;": {'\u2AC6', '\u0338'}, + "nsupset;": {'\u2283', '\u20D2'}, + "nsupseteqq;": {'\u2AC6', '\u0338'}, + "nvap;": {'\u224D', '\u20D2'}, + "nvge;": {'\u2265', '\u20D2'}, + "nvgt;": {'\u003E', '\u20D2'}, + "nvle;": {'\u2264', '\u20D2'}, + "nvlt;": {'\u003C', '\u20D2'}, + "nvltrie;": {'\u22B4', '\u20D2'}, + "nvrtrie;": {'\u22B5', '\u20D2'}, + "nvsim;": {'\u223C', '\u20D2'}, + "race;": {'\u223D', '\u0331'}, + "smtes;": {'\u2AAC', '\uFE00'}, + "sqcaps;": {'\u2293', '\uFE00'}, + "sqcups;": {'\u2294', '\uFE00'}, + "varsubsetneq;": {'\u228A', '\uFE00'}, + "varsubsetneqq;": {'\u2ACB', '\uFE00'}, + "varsupsetneq;": {'\u228B', '\uFE00'}, + "varsupsetneqq;": {'\u2ACC', '\uFE00'}, + "vnsub;": {'\u2282', '\u20D2'}, + "vnsup;": {'\u2283', '\u20D2'}, + "vsubnE;": {'\u2ACB', '\uFE00'}, + "vsubne;": {'\u228A', '\uFE00'}, + "vsupnE;": {'\u2ACC', '\uFE00'}, + "vsupne;": {'\u228B', '\uFE00'}, +} diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go new file mode 100644 index 00000000..04c6bec2 --- /dev/null +++ b/vendor/golang.org/x/net/html/escape.go @@ -0,0 +1,339 @@ +// 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 html + +import ( + "bytes" + "strings" + "unicode/utf8" +) + +// These replacements permit compatibility with old numeric entities that +// assumed Windows-1252 encoding. +// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference +var replacementTable = [...]rune{ + '\u20AC', // First entry is what 0x80 should be replaced with. + '\u0081', + '\u201A', + '\u0192', + '\u201E', + '\u2026', + '\u2020', + '\u2021', + '\u02C6', + '\u2030', + '\u0160', + '\u2039', + '\u0152', + '\u008D', + '\u017D', + '\u008F', + '\u0090', + '\u2018', + '\u2019', + '\u201C', + '\u201D', + '\u2022', + '\u2013', + '\u2014', + '\u02DC', + '\u2122', + '\u0161', + '\u203A', + '\u0153', + '\u009D', + '\u017E', + '\u0178', // Last entry is 0x9F. + // 0x00->'\uFFFD' is handled programmatically. + // 0x0D->'\u000D' is a no-op. +} + +// unescapeEntity reads an entity like "<" from b[src:] and writes the +// corresponding "<" to b[dst:], returning the incremented dst and src cursors. +// Precondition: b[src] == '&' && dst <= src. +// attribute should be true if parsing an attribute value. +func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { + // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference + + // i starts at 1 because we already know that s[0] == '&'. + i, s := 1, b[src:] + + if len(s) <= 1 { + b[dst] = b[src] + return dst + 1, src + 1 + } + + if s[i] == '#' { + if len(s) <= 3 { // We need to have at least "&#.". + b[dst] = b[src] + return dst + 1, src + 1 + } + i++ + c := s[i] + hex := false + if c == 'x' || c == 'X' { + hex = true + i++ + } + + x := '\x00' + for i < len(s) { + c = s[i] + i++ + if hex { + if '0' <= c && c <= '9' { + x = 16*x + rune(c) - '0' + continue + } else if 'a' <= c && c <= 'f' { + x = 16*x + rune(c) - 'a' + 10 + continue + } else if 'A' <= c && c <= 'F' { + x = 16*x + rune(c) - 'A' + 10 + continue + } + } else if '0' <= c && c <= '9' { + x = 10*x + rune(c) - '0' + continue + } + if c != ';' { + i-- + } + break + } + + if i <= 3 { // No characters matched. + b[dst] = b[src] + return dst + 1, src + 1 + } + + if 0x80 <= x && x <= 0x9F { + // Replace characters from Windows-1252 with UTF-8 equivalents. + x = replacementTable[x-0x80] + } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { + // Replace invalid characters with the replacement character. + x = '\uFFFD' + } + + return dst + utf8.EncodeRune(b[dst:], x), src + i + } + + // Consume the maximum number of characters possible, with the + // consumed characters matching one of the named references. + + for i < len(s) { + c := s[i] + i++ + // Lower-cased characters are more common in entities, so we check for them first. + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { + continue + } + if c != ';' { + i-- + } + break + } + + entityName := string(s[1:i]) + if entityName == "" { + // No-op. + } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { + // No-op. + } else if x := entity[entityName]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + i + } else if x := entity2[entityName]; x[0] != 0 { + dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) + return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i + } else if !attribute { + maxLen := len(entityName) - 1 + if maxLen > longestEntityWithoutSemicolon { + maxLen = longestEntityWithoutSemicolon + } + for j := maxLen; j > 1; j-- { + if x := entity[entityName[:j]]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 + } + } + } + + dst1, src1 = dst+i, src+i + copy(b[dst:dst1], b[src:src1]) + return dst1, src1 +} + +// unescape unescapes b's entities in-place, so that "a<b" becomes "a' byte that, per above, we'd like to avoid escaping unless we have to. +// +// Studying the summary table (and T actions in its '>' column) closely, we +// only need to escape in states 43, 44, 49, 51 and 52. State 43 is at the +// start of the comment data. State 52 is after a '!'. The other three states +// are after a '-'. +// +// Our algorithm is thus to escape every '&' and to escape '>' if and only if: +// - The '>' is after a '!' or '-' (in the unescaped data) or +// - The '>' is at the start of the comment data (after the opening ""); err != nil { + return err + } + return nil + case DoctypeNode: + if _, err := w.WriteString("') + case RawNode: + _, err := w.WriteString(n.Data) + return err + default: + return errors.New("html: unknown node type") + } + + // Render the opening tag. + if err := w.WriteByte('<'); err != nil { + return err + } + if _, err := w.WriteString(n.Data); err != nil { + return err + } + for _, a := range n.Attr { + if err := w.WriteByte(' '); err != nil { + return err + } + if a.Namespace != "" { + if _, err := w.WriteString(a.Namespace); err != nil { + return err + } + if err := w.WriteByte(':'); err != nil { + return err + } + } + if _, err := w.WriteString(a.Key); err != nil { + return err + } + if _, err := w.WriteString(`="`); err != nil { + return err + } + if err := escape(w, a.Val); err != nil { + return err + } + if err := w.WriteByte('"'); err != nil { + return err + } + } + if voidElements[n.Data] { + if n.FirstChild != nil { + return fmt.Errorf("html: void element <%s> has child nodes", n.Data) + } + _, err := w.WriteString("/>") + return err + } + if err := w.WriteByte('>'); err != nil { + return err + } + + // Add initial newline where there is danger of a newline beging ignored. + if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") { + switch n.Data { + case "pre", "listing", "textarea": + if err := w.WriteByte('\n'); err != nil { + return err + } + } + } + + // Render any child nodes + if childTextNodesAreLiteral(n) { + for c := n.FirstChild; c != nil; c = c.NextSibling { + if c.Type == TextNode { + if _, err := w.WriteString(c.Data); err != nil { + return err + } + } else { + if err := render1(w, c); err != nil { + return err + } + } + } + if n.Data == "plaintext" { + // Don't render anything else. must be the + // last element in the file, with no closing tag. + return plaintextAbort + } + } else { + for c := n.FirstChild; c != nil; c = c.NextSibling { + if err := render1(w, c); err != nil { + return err + } + } + } + + // Render the </xxx> closing tag. + if _, err := w.WriteString("</"); err != nil { + return err + } + if _, err := w.WriteString(n.Data); err != nil { + return err + } + return w.WriteByte('>') +} + +func childTextNodesAreLiteral(n *Node) bool { + // Per WHATWG HTML 13.3, if the parent of the current node is a style, + // script, xmp, iframe, noembed, noframes, or plaintext element, and the + // current node is a text node, append the value of the node's data + // literally. The specification is not explicit about it, but we only + // enforce this if we are in the HTML namespace (i.e. when the namespace is + // ""). + // NOTE: we also always include noscript elements, although the + // specification states that they should only be rendered as such if + // scripting is enabled for the node (which is not something we track). + if n.Namespace != "" { + return false + } + switch n.Data { + case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": + return true + default: + return false + } +} + +// writeQuoted writes s to w surrounded by quotes. Normally it will use double +// quotes, but if s contains a double quote, it will use single quotes. +// It is used for writing the identifiers in a doctype declaration. +// In valid HTML, they can't contain both types of quotes. +func writeQuoted(w writer, s string) error { + var q byte = '"' + if strings.Contains(s, `"`) { + q = '\'' + } + if err := w.WriteByte(q); err != nil { + return err + } + if _, err := w.WriteString(s); err != nil { + return err + } + if err := w.WriteByte(q); err != nil { + return err + } + return nil +} + +// Section 12.1.2, "Elements", gives this list of void elements. Void elements +// are those that can't have any contents. +var voidElements = map[string]bool{ + "area": true, + "base": true, + "br": true, + "col": true, + "embed": true, + "hr": true, + "img": true, + "input": true, + "keygen": true, // "keygen" has been removed from the spec, but are kept here for backwards compatibility. + "link": true, + "meta": true, + "param": true, + "source": true, + "track": true, + "wbr": true, +} diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go new file mode 100644 index 00000000..3c57880d --- /dev/null +++ b/vendor/golang.org/x/net/html/token.go @@ -0,0 +1,1272 @@ +// 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 html + +import ( + "bytes" + "errors" + "io" + "strconv" + "strings" + + "golang.org/x/net/html/atom" +) + +// A TokenType is the type of a Token. +type TokenType uint32 + +const ( + // ErrorToken means that an error occurred during tokenization. + ErrorToken TokenType = iota + // TextToken means a text node. + TextToken + // A StartTagToken looks like <a>. + StartTagToken + // An EndTagToken looks like </a>. + EndTagToken + // A SelfClosingTagToken tag looks like <br/>. + SelfClosingTagToken + // A CommentToken looks like <!--x-->. + CommentToken + // A DoctypeToken looks like <!DOCTYPE x> + DoctypeToken +) + +// ErrBufferExceeded means that the buffering limit was exceeded. +var ErrBufferExceeded = errors.New("max buffer exceeded") + +// String returns a string representation of the TokenType. +func (t TokenType) String() string { + switch t { + case ErrorToken: + return "Error" + case TextToken: + return "Text" + case StartTagToken: + return "StartTag" + case EndTagToken: + return "EndTag" + case SelfClosingTagToken: + return "SelfClosingTag" + case CommentToken: + return "Comment" + case DoctypeToken: + return "Doctype" + } + return "Invalid(" + strconv.Itoa(int(t)) + ")" +} + +// An Attribute is an attribute namespace-key-value triple. Namespace is +// non-empty for foreign attributes like xlink, Key is alphabetic (and hence +// does not contain escapable characters like '&', '<' or '>'), and Val is +// unescaped (it looks like "a<b" rather than "a&lt;b"). +// +// Namespace is only used by the parser, not the tokenizer. +type Attribute struct { + Namespace, Key, Val string +} + +// A Token consists of a TokenType and some Data (tag name for start and end +// tags, content for text, comments and doctypes). A tag Token may also contain +// a slice of Attributes. Data is unescaped for all Tokens (it looks like "a<b" +// rather than "a&lt;b"). For tag Tokens, DataAtom is the atom for Data, or +// zero if Data is not a known tag name. +type Token struct { + Type TokenType + DataAtom atom.Atom + Data string + Attr []Attribute +} + +// tagString returns a string representation of a tag Token's Data and Attr. +func (t Token) tagString() string { + if len(t.Attr) == 0 { + return t.Data + } + buf := bytes.NewBufferString(t.Data) + for _, a := range t.Attr { + buf.WriteByte(' ') + buf.WriteString(a.Key) + buf.WriteString(`="`) + escape(buf, a.Val) + buf.WriteByte('"') + } + return buf.String() +} + +// String returns a string representation of the Token. +func (t Token) String() string { + switch t.Type { + case ErrorToken: + return "" + case TextToken: + return EscapeString(t.Data) + case StartTagToken: + return "<" + t.tagString() + ">" + case EndTagToken: + return "</" + t.tagString() + ">" + case SelfClosingTagToken: + return "<" + t.tagString() + "/>" + case CommentToken: + return "<!--" + escapeCommentString(t.Data) + "-->" + case DoctypeToken: + return "<!DOCTYPE " + EscapeString(t.Data) + ">" + } + return "Invalid(" + strconv.Itoa(int(t.Type)) + ")" +} + +// span is a range of bytes in a Tokenizer's buffer. The start is inclusive, +// the end is exclusive. +type span struct { + start, end int +} + +// A Tokenizer returns a stream of HTML Tokens. +type Tokenizer struct { + // r is the source of the HTML text. + r io.Reader + // tt is the TokenType of the current token. + tt TokenType + // err is the first error encountered during tokenization. It is possible + // for tt != Error && err != nil to hold: this means that Next returned a + // valid token but the subsequent Next call will return an error token. + // For example, if the HTML text input was just "plain", then the first + // Next call would set z.err to io.EOF but return a TextToken, and all + // subsequent Next calls would return an ErrorToken. + // err is never reset. Once it becomes non-nil, it stays non-nil. + err error + // readErr is the error returned by the io.Reader r. It is separate from + // err because it is valid for an io.Reader to return (n int, err1 error) + // such that n > 0 && err1 != nil, and callers should always process the + // n > 0 bytes before considering the error err1. + readErr error + // buf[raw.start:raw.end] holds the raw bytes of the current token. + // buf[raw.end:] is buffered input that will yield future tokens. + raw span + buf []byte + // maxBuf limits the data buffered in buf. A value of 0 means unlimited. + maxBuf int + // buf[data.start:data.end] holds the raw bytes of the current token's data: + // a text token's text, a tag token's tag name, etc. + data span + // pendingAttr is the attribute key and value currently being tokenized. + // When complete, pendingAttr is pushed onto attr. nAttrReturned is + // incremented on each call to TagAttr. + pendingAttr [2]span + attr [][2]span + nAttrReturned int + // rawTag is the "script" in "</script>" that closes the next token. If + // non-empty, the subsequent call to Next will return a raw or RCDATA text + // token: one that treats "<p>" as text instead of an element. + // rawTag's contents are lower-cased. + rawTag string + // textIsRaw is whether the current text token's data is not escaped. + textIsRaw bool + // convertNUL is whether NUL bytes in the current token's data should + // be converted into \ufffd replacement characters. + convertNUL bool + // allowCDATA is whether CDATA sections are allowed in the current context. + allowCDATA bool +} + +// AllowCDATA sets whether or not the tokenizer recognizes <![CDATA[foo]]> as +// the text "foo". The default value is false, which means to recognize it as +// a bogus comment "<!-- [CDATA[foo]] -->" instead. +// +// Strictly speaking, an HTML5 compliant tokenizer should allow CDATA if and +// only if tokenizing foreign content, such as MathML and SVG. However, +// tracking foreign-contentness is difficult to do purely in the tokenizer, +// as opposed to the parser, due to HTML integration points: an <svg> element +// can contain a <foreignObject> that is foreign-to-SVG but not foreign-to- +// HTML. For strict compliance with the HTML5 tokenization algorithm, it is the +// responsibility of the user of a tokenizer to call AllowCDATA as appropriate. +// In practice, if using the tokenizer without caring whether MathML or SVG +// CDATA is text or comments, such as tokenizing HTML to find all the anchor +// text, it is acceptable to ignore this responsibility. +func (z *Tokenizer) AllowCDATA(allowCDATA bool) { + z.allowCDATA = allowCDATA +} + +// NextIsNotRawText instructs the tokenizer that the next token should not be +// considered as 'raw text'. Some elements, such as script and title elements, +// normally require the next token after the opening tag to be 'raw text' that +// has no child elements. For example, tokenizing "<title>a<b>c</b>d</title>" +// yields a start tag token for "<title>", a text token for "a<b>c</b>d", and +// an end tag token for "</title>". There are no distinct start tag or end tag +// tokens for the "<b>" and "</b>". +// +// This tokenizer implementation will generally look for raw text at the right +// times. Strictly speaking, an HTML5 compliant tokenizer should not look for +// raw text if in foreign content: <title> generally needs raw text, but a +// <title> inside an <svg> does not. Another example is that a <textarea> +// generally needs raw text, but a <textarea> is not allowed as an immediate +// child of a <select>; in normal parsing, a <textarea> implies </select>, but +// one cannot close the implicit element when parsing a <select>'s InnerHTML. +// Similarly to AllowCDATA, tracking the correct moment to override raw-text- +// ness is difficult to do purely in the tokenizer, as opposed to the parser. +// For strict compliance with the HTML5 tokenization algorithm, it is the +// responsibility of the user of a tokenizer to call NextIsNotRawText as +// appropriate. In practice, like AllowCDATA, it is acceptable to ignore this +// responsibility for basic usage. +// +// Note that this 'raw text' concept is different from the one offered by the +// Tokenizer.Raw method. +func (z *Tokenizer) NextIsNotRawText() { + z.rawTag = "" +} + +// Err returns the error associated with the most recent ErrorToken token. +// This is typically io.EOF, meaning the end of tokenization. +func (z *Tokenizer) Err() error { + if z.tt != ErrorToken { + return nil + } + return z.err +} + +// readByte returns the next byte from the input stream, doing a buffered read +// from z.r into z.buf if necessary. z.buf[z.raw.start:z.raw.end] remains a contiguous byte +// slice that holds all the bytes read so far for the current token. +// It sets z.err if the underlying reader returns an error. +// Pre-condition: z.err == nil. +func (z *Tokenizer) readByte() byte { + if z.raw.end >= len(z.buf) { + // Our buffer is exhausted and we have to read from z.r. Check if the + // previous read resulted in an error. + if z.readErr != nil { + z.err = z.readErr + return 0 + } + // We copy z.buf[z.raw.start:z.raw.end] to the beginning of z.buf. If the length + // z.raw.end - z.raw.start is more than half the capacity of z.buf, then we + // allocate a new buffer before the copy. + c := cap(z.buf) + d := z.raw.end - z.raw.start + var buf1 []byte + if 2*d > c { + buf1 = make([]byte, d, 2*c) + } else { + buf1 = z.buf[:d] + } + copy(buf1, z.buf[z.raw.start:z.raw.end]) + if x := z.raw.start; x != 0 { + // Adjust the data/attr spans to refer to the same contents after the copy. + z.data.start -= x + z.data.end -= x + z.pendingAttr[0].start -= x + z.pendingAttr[0].end -= x + z.pendingAttr[1].start -= x + z.pendingAttr[1].end -= x + for i := range z.attr { + z.attr[i][0].start -= x + z.attr[i][0].end -= x + z.attr[i][1].start -= x + z.attr[i][1].end -= x + } + } + z.raw.start, z.raw.end, z.buf = 0, d, buf1[:d] + // Now that we have copied the live bytes to the start of the buffer, + // we read from z.r into the remainder. + var n int + n, z.readErr = readAtLeastOneByte(z.r, buf1[d:cap(buf1)]) + if n == 0 { + z.err = z.readErr + return 0 + } + z.buf = buf1[:d+n] + } + x := z.buf[z.raw.end] + z.raw.end++ + if z.maxBuf > 0 && z.raw.end-z.raw.start >= z.maxBuf { + z.err = ErrBufferExceeded + return 0 + } + return x +} + +// Buffered returns a slice containing data buffered but not yet tokenized. +func (z *Tokenizer) Buffered() []byte { + return z.buf[z.raw.end:] +} + +// readAtLeastOneByte wraps an io.Reader so that reading cannot return (0, nil). +// It returns io.ErrNoProgress if the underlying r.Read method returns (0, nil) +// too many times in succession. +func readAtLeastOneByte(r io.Reader, b []byte) (int, error) { + for i := 0; i < 100; i++ { + if n, err := r.Read(b); n != 0 || err != nil { + return n, err + } + } + return 0, io.ErrNoProgress +} + +// skipWhiteSpace skips past any white space. +func (z *Tokenizer) skipWhiteSpace() { + if z.err != nil { + return + } + for { + c := z.readByte() + if z.err != nil { + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f': + // No-op. + default: + z.raw.end-- + return + } + } +} + +// readRawOrRCDATA reads until the next "</foo>", where "foo" is z.rawTag and +// is typically something like "script" or "textarea". +func (z *Tokenizer) readRawOrRCDATA() { + if z.rawTag == "script" { + z.readScript() + z.textIsRaw = true + z.rawTag = "" + return + } +loop: + for { + c := z.readByte() + if z.err != nil { + break loop + } + if c != '<' { + continue loop + } + c = z.readByte() + if z.err != nil { + break loop + } + if c != '/' { + z.raw.end-- + continue loop + } + if z.readRawEndTag() || z.err != nil { + break loop + } + } + z.data.end = z.raw.end + // A textarea's or title's RCDATA can contain escaped entities. + z.textIsRaw = z.rawTag != "textarea" && z.rawTag != "title" + z.rawTag = "" +} + +// readRawEndTag attempts to read a tag like "</foo>", where "foo" is z.rawTag. +// If it succeeds, it backs up the input position to reconsume the tag and +// returns true. Otherwise it returns false. The opening "</" has already been +// consumed. +func (z *Tokenizer) readRawEndTag() bool { + for i := 0; i < len(z.rawTag); i++ { + c := z.readByte() + if z.err != nil { + return false + } + if c != z.rawTag[i] && c != z.rawTag[i]-('a'-'A') { + z.raw.end-- + return false + } + } + c := z.readByte() + if z.err != nil { + return false + } + switch c { + case ' ', '\n', '\r', '\t', '\f', '/', '>': + // The 3 is 2 for the leading "</" plus 1 for the trailing character c. + z.raw.end -= 3 + len(z.rawTag) + return true + } + z.raw.end-- + return false +} + +// readScript reads until the next </script> tag, following the byzantine +// rules for escaping/hiding the closing tag. +func (z *Tokenizer) readScript() { + defer func() { + z.data.end = z.raw.end + }() + var c byte + +scriptData: + c = z.readByte() + if z.err != nil { + return + } + if c == '<' { + goto scriptDataLessThanSign + } + goto scriptData + +scriptDataLessThanSign: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '/': + goto scriptDataEndTagOpen + case '!': + goto scriptDataEscapeStart + } + z.raw.end-- + goto scriptData + +scriptDataEndTagOpen: + if z.readRawEndTag() || z.err != nil { + return + } + goto scriptData + +scriptDataEscapeStart: + c = z.readByte() + if z.err != nil { + return + } + if c == '-' { + goto scriptDataEscapeStartDash + } + z.raw.end-- + goto scriptData + +scriptDataEscapeStartDash: + c = z.readByte() + if z.err != nil { + return + } + if c == '-' { + goto scriptDataEscapedDashDash + } + z.raw.end-- + goto scriptData + +scriptDataEscaped: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataEscapedDash + case '<': + goto scriptDataEscapedLessThanSign + } + goto scriptDataEscaped + +scriptDataEscapedDash: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataEscapedDashDash + case '<': + goto scriptDataEscapedLessThanSign + } + goto scriptDataEscaped + +scriptDataEscapedDashDash: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataEscapedDashDash + case '<': + goto scriptDataEscapedLessThanSign + case '>': + goto scriptData + } + goto scriptDataEscaped + +scriptDataEscapedLessThanSign: + c = z.readByte() + if z.err != nil { + return + } + if c == '/' { + goto scriptDataEscapedEndTagOpen + } + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { + goto scriptDataDoubleEscapeStart + } + z.raw.end-- + goto scriptData + +scriptDataEscapedEndTagOpen: + if z.readRawEndTag() || z.err != nil { + return + } + goto scriptDataEscaped + +scriptDataDoubleEscapeStart: + z.raw.end-- + for i := 0; i < len("script"); i++ { + c = z.readByte() + if z.err != nil { + return + } + if c != "script"[i] && c != "SCRIPT"[i] { + z.raw.end-- + goto scriptDataEscaped + } + } + c = z.readByte() + if z.err != nil { + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f', '/', '>': + goto scriptDataDoubleEscaped + } + z.raw.end-- + goto scriptDataEscaped + +scriptDataDoubleEscaped: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataDoubleEscapedDash + case '<': + goto scriptDataDoubleEscapedLessThanSign + } + goto scriptDataDoubleEscaped + +scriptDataDoubleEscapedDash: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataDoubleEscapedDashDash + case '<': + goto scriptDataDoubleEscapedLessThanSign + } + goto scriptDataDoubleEscaped + +scriptDataDoubleEscapedDashDash: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataDoubleEscapedDashDash + case '<': + goto scriptDataDoubleEscapedLessThanSign + case '>': + goto scriptData + } + goto scriptDataDoubleEscaped + +scriptDataDoubleEscapedLessThanSign: + c = z.readByte() + if z.err != nil { + return + } + if c == '/' { + goto scriptDataDoubleEscapeEnd + } + z.raw.end-- + goto scriptDataDoubleEscaped + +scriptDataDoubleEscapeEnd: + if z.readRawEndTag() { + z.raw.end += len("</script>") + goto scriptDataEscaped + } + if z.err != nil { + return + } + goto scriptDataDoubleEscaped +} + +// readComment reads the next comment token starting with "<!--". The opening +// "<!--" has already been consumed. +func (z *Tokenizer) readComment() { + // When modifying this function, consider manually increasing the + // maxSuffixLen constant in func TestComments, from 6 to e.g. 9 or more. + // That increase should only be temporary, not committed, as it + // exponentially affects the test running time. + + z.data.start = z.raw.end + defer func() { + if z.data.end < z.data.start { + // It's a comment with no data, like <!-->. + z.data.end = z.data.start + } + }() + + var dashCount int + beginning := true + for { + c := z.readByte() + if z.err != nil { + z.data.end = z.calculateAbruptCommentDataEnd() + return + } + switch c { + case '-': + dashCount++ + continue + case '>': + if dashCount >= 2 || beginning { + z.data.end = z.raw.end - len("-->") + return + } + case '!': + if dashCount >= 2 { + c = z.readByte() + if z.err != nil { + z.data.end = z.calculateAbruptCommentDataEnd() + return + } else if c == '>' { + z.data.end = z.raw.end - len("--!>") + return + } else if c == '-' { + dashCount = 1 + beginning = false + continue + } + } + } + dashCount = 0 + beginning = false + } +} + +func (z *Tokenizer) calculateAbruptCommentDataEnd() int { + raw := z.Raw() + const prefixLen = len("<!--") + if len(raw) >= prefixLen { + raw = raw[prefixLen:] + if hasSuffix(raw, "--!") { + return z.raw.end - 3 + } else if hasSuffix(raw, "--") { + return z.raw.end - 2 + } else if hasSuffix(raw, "-") { + return z.raw.end - 1 + } + } + return z.raw.end +} + +func hasSuffix(b []byte, suffix string) bool { + if len(b) < len(suffix) { + return false + } + b = b[len(b)-len(suffix):] + for i := range b { + if b[i] != suffix[i] { + return false + } + } + return true +} + +// readUntilCloseAngle reads until the next ">". +func (z *Tokenizer) readUntilCloseAngle() { + z.data.start = z.raw.end + for { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return + } + if c == '>' { + z.data.end = z.raw.end - len(">") + return + } + } +} + +// readMarkupDeclaration reads the next token starting with "<!". It might be +// a "<!--comment-->", a "<!DOCTYPE foo>", a "<![CDATA[section]]>" or +// "<!a bogus comment". The opening "<!" has already been consumed. +func (z *Tokenizer) readMarkupDeclaration() TokenType { + z.data.start = z.raw.end + var c [2]byte + for i := 0; i < 2; i++ { + c[i] = z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return CommentToken + } + } + if c[0] == '-' && c[1] == '-' { + z.readComment() + return CommentToken + } + z.raw.end -= 2 + if z.readDoctype() { + return DoctypeToken + } + if z.allowCDATA && z.readCDATA() { + z.convertNUL = true + return TextToken + } + // It's a bogus comment. + z.readUntilCloseAngle() + return CommentToken +} + +// readDoctype attempts to read a doctype declaration and returns true if +// successful. The opening "<!" has already been consumed. +func (z *Tokenizer) readDoctype() bool { + const s = "DOCTYPE" + for i := 0; i < len(s); i++ { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return false + } + if c != s[i] && c != s[i]+('a'-'A') { + // Back up to read the fragment of "DOCTYPE" again. + z.raw.end = z.data.start + return false + } + } + if z.skipWhiteSpace(); z.err != nil { + z.data.start = z.raw.end + z.data.end = z.raw.end + return true + } + z.readUntilCloseAngle() + return true +} + +// readCDATA attempts to read a CDATA section and returns true if +// successful. The opening "<!" has already been consumed. +func (z *Tokenizer) readCDATA() bool { + const s = "[CDATA[" + for i := 0; i < len(s); i++ { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return false + } + if c != s[i] { + // Back up to read the fragment of "[CDATA[" again. + z.raw.end = z.data.start + return false + } + } + z.data.start = z.raw.end + brackets := 0 + for { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return true + } + switch c { + case ']': + brackets++ + case '>': + if brackets >= 2 { + z.data.end = z.raw.end - len("]]>") + return true + } + brackets = 0 + default: + brackets = 0 + } + } +} + +// startTagIn returns whether the start tag in z.buf[z.data.start:z.data.end] +// case-insensitively matches any element of ss. +func (z *Tokenizer) startTagIn(ss ...string) bool { +loop: + for _, s := range ss { + if z.data.end-z.data.start != len(s) { + continue loop + } + for i := 0; i < len(s); i++ { + c := z.buf[z.data.start+i] + if 'A' <= c && c <= 'Z' { + c += 'a' - 'A' + } + if c != s[i] { + continue loop + } + } + return true + } + return false +} + +// readStartTag reads the next start tag token. The opening "<a" has already +// been consumed, where 'a' means anything in [A-Za-z]. +func (z *Tokenizer) readStartTag() TokenType { + z.readTag(true) + if z.err != nil { + return ErrorToken + } + // Several tags flag the tokenizer's next token as raw. + c, raw := z.buf[z.data.start], false + if 'A' <= c && c <= 'Z' { + c += 'a' - 'A' + } + switch c { + case 'i': + raw = z.startTagIn("iframe") + case 'n': + raw = z.startTagIn("noembed", "noframes", "noscript") + case 'p': + raw = z.startTagIn("plaintext") + case 's': + raw = z.startTagIn("script", "style") + case 't': + raw = z.startTagIn("textarea", "title") + case 'x': + raw = z.startTagIn("xmp") + } + if raw { + z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) + } + // Look for a self-closing token like "<br/>". + if z.err == nil && z.buf[z.raw.end-2] == '/' { + return SelfClosingTagToken + } + return StartTagToken +} + +// readTag reads the next tag token and its attributes. If saveAttr, those +// attributes are saved in z.attr, otherwise z.attr is set to an empty slice. +// The opening "<a" or "</a" has already been consumed, where 'a' means anything +// in [A-Za-z]. +func (z *Tokenizer) readTag(saveAttr bool) { + z.attr = z.attr[:0] + z.nAttrReturned = 0 + // Read the tag name and attribute key/value pairs. + z.readTagName() + if z.skipWhiteSpace(); z.err != nil { + return + } + for { + c := z.readByte() + if z.err != nil || c == '>' { + break + } + z.raw.end-- + z.readTagAttrKey() + z.readTagAttrVal() + // Save pendingAttr if saveAttr and that attribute has a non-empty key. + if saveAttr && z.pendingAttr[0].start != z.pendingAttr[0].end { + z.attr = append(z.attr, z.pendingAttr) + } + if z.skipWhiteSpace(); z.err != nil { + break + } + } +} + +// readTagName sets z.data to the "div" in "<div k=v>". The reader (z.raw.end) +// is positioned such that the first byte of the tag name (the "d" in "<div") +// has already been consumed. +func (z *Tokenizer) readTagName() { + z.data.start = z.raw.end - 1 + for { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f': + z.data.end = z.raw.end - 1 + return + case '/', '>': + z.raw.end-- + z.data.end = z.raw.end + return + } + } +} + +// readTagAttrKey sets z.pendingAttr[0] to the "k" in "<div k=v>". +// Precondition: z.err == nil. +func (z *Tokenizer) readTagAttrKey() { + z.pendingAttr[0].start = z.raw.end + for { + c := z.readByte() + if z.err != nil { + z.pendingAttr[0].end = z.raw.end + return + } + switch c { + case '=': + if z.pendingAttr[0].start+1 == z.raw.end { + // WHATWG 13.2.5.32, if we see an equals sign before the attribute name + // begins, we treat it as a character in the attribute name and continue. + continue + } + fallthrough + case ' ', '\n', '\r', '\t', '\f', '/', '>': + // WHATWG 13.2.5.33 Attribute name state + // We need to reconsume the char in the after attribute name state to support the / character + z.raw.end-- + z.pendingAttr[0].end = z.raw.end + return + } + } +} + +// readTagAttrVal sets z.pendingAttr[1] to the "v" in "<div k=v>". +func (z *Tokenizer) readTagAttrVal() { + z.pendingAttr[1].start = z.raw.end + z.pendingAttr[1].end = z.raw.end + if z.skipWhiteSpace(); z.err != nil { + return + } + c := z.readByte() + if z.err != nil { + return + } + if c == '/' { + // WHATWG 13.2.5.34 After attribute name state + // U+002F SOLIDUS (/) - Switch to the self-closing start tag state. + return + } + if c != '=' { + z.raw.end-- + return + } + if z.skipWhiteSpace(); z.err != nil { + return + } + quote := z.readByte() + if z.err != nil { + return + } + switch quote { + case '>': + z.raw.end-- + return + + case '\'', '"': + z.pendingAttr[1].start = z.raw.end + for { + c := z.readByte() + if z.err != nil { + z.pendingAttr[1].end = z.raw.end + return + } + if c == quote { + z.pendingAttr[1].end = z.raw.end - 1 + return + } + } + + default: + z.pendingAttr[1].start = z.raw.end - 1 + for { + c := z.readByte() + if z.err != nil { + z.pendingAttr[1].end = z.raw.end + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f': + z.pendingAttr[1].end = z.raw.end - 1 + return + case '>': + z.raw.end-- + z.pendingAttr[1].end = z.raw.end + return + } + } + } +} + +// Next scans the next token and returns its type. +func (z *Tokenizer) Next() TokenType { + z.raw.start = z.raw.end + z.data.start = z.raw.end + z.data.end = z.raw.end + if z.err != nil { + z.tt = ErrorToken + return z.tt + } + if z.rawTag != "" { + if z.rawTag == "plaintext" { + // Read everything up to EOF. + for z.err == nil { + z.readByte() + } + z.data.end = z.raw.end + z.textIsRaw = true + } else { + z.readRawOrRCDATA() + } + if z.data.end > z.data.start { + z.tt = TextToken + z.convertNUL = true + return z.tt + } + } + z.textIsRaw = false + z.convertNUL = false + +loop: + for { + c := z.readByte() + if z.err != nil { + break loop + } + if c != '<' { + continue loop + } + + // Check if the '<' we have just read is part of a tag, comment + // or doctype. If not, it's part of the accumulated text token. + c = z.readByte() + if z.err != nil { + break loop + } + var tokenType TokenType + switch { + case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z': + tokenType = StartTagToken + case c == '/': + tokenType = EndTagToken + case c == '!' || c == '?': + // We use CommentToken to mean any of "<!--actual comments-->", + // "<!DOCTYPE declarations>" and "<?xml processing instructions?>". + tokenType = CommentToken + default: + // Reconsume the current character. + z.raw.end-- + continue + } + + // We have a non-text token, but we might have accumulated some text + // before that. If so, we return the text first, and return the non- + // text token on the subsequent call to Next. + if x := z.raw.end - len("<a"); z.raw.start < x { + z.raw.end = x + z.data.end = x + z.tt = TextToken + return z.tt + } + switch tokenType { + case StartTagToken: + z.tt = z.readStartTag() + return z.tt + case EndTagToken: + c = z.readByte() + if z.err != nil { + break loop + } + if c == '>' { + // "</>" does not generate a token at all. Generate an empty comment + // to allow passthrough clients to pick up the data using Raw. + // Reset the tokenizer state and start again. + z.tt = CommentToken + return z.tt + } + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { + z.readTag(false) + if z.err != nil { + z.tt = ErrorToken + } else { + z.tt = EndTagToken + } + return z.tt + } + z.raw.end-- + z.readUntilCloseAngle() + z.tt = CommentToken + return z.tt + case CommentToken: + if c == '!' { + z.tt = z.readMarkupDeclaration() + return z.tt + } + z.raw.end-- + z.readUntilCloseAngle() + z.tt = CommentToken + return z.tt + } + } + if z.raw.start < z.raw.end { + z.data.end = z.raw.end + z.tt = TextToken + return z.tt + } + z.tt = ErrorToken + return z.tt +} + +// Raw returns the unmodified text of the current token. Calling Next, Token, +// Text, TagName or TagAttr may change the contents of the returned slice. +// +// The token stream's raw bytes partition the byte stream (up until an +// ErrorToken). There are no overlaps or gaps between two consecutive token's +// raw bytes. One implication is that the byte offset of the current token is +// the sum of the lengths of all previous tokens' raw bytes. +func (z *Tokenizer) Raw() []byte { + return z.buf[z.raw.start:z.raw.end] +} + +// convertNewlines converts "\r" and "\r\n" in s to "\n". +// The conversion happens in place, but the resulting slice may be shorter. +func convertNewlines(s []byte) []byte { + for i, c := range s { + if c != '\r' { + continue + } + + src := i + 1 + if src >= len(s) || s[src] != '\n' { + s[i] = '\n' + continue + } + + dst := i + for src < len(s) { + if s[src] == '\r' { + if src+1 < len(s) && s[src+1] == '\n' { + src++ + } + s[dst] = '\n' + } else { + s[dst] = s[src] + } + src++ + dst++ + } + return s[:dst] + } + return s +} + +var ( + nul = []byte("\x00") + replacement = []byte("\ufffd") +) + +// Text returns the unescaped text of a text, comment or doctype token. The +// contents of the returned slice may change on the next call to Next. +func (z *Tokenizer) Text() []byte { + switch z.tt { + case TextToken, CommentToken, DoctypeToken: + s := z.buf[z.data.start:z.data.end] + z.data.start = z.raw.end + z.data.end = z.raw.end + s = convertNewlines(s) + if (z.convertNUL || z.tt == CommentToken) && bytes.Contains(s, nul) { + s = bytes.Replace(s, nul, replacement, -1) + } + if !z.textIsRaw { + s = unescape(s, false) + } + return s + } + return nil +} + +// TagName returns the lower-cased name of a tag token (the `img` out of +// `<IMG SRC="foo">`) and whether the tag has attributes. +// The contents of the returned slice may change on the next call to Next. +func (z *Tokenizer) TagName() (name []byte, hasAttr bool) { + if z.data.start < z.data.end { + switch z.tt { + case StartTagToken, EndTagToken, SelfClosingTagToken: + s := z.buf[z.data.start:z.data.end] + z.data.start = z.raw.end + z.data.end = z.raw.end + return lower(s), z.nAttrReturned < len(z.attr) + } + } + return nil, false +} + +// TagAttr returns the lower-cased key and unescaped value of the next unparsed +// attribute for the current tag token and whether there are more attributes. +// The contents of the returned slices may change on the next call to Next. +func (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) { + if z.nAttrReturned < len(z.attr) { + switch z.tt { + case StartTagToken, SelfClosingTagToken: + x := z.attr[z.nAttrReturned] + z.nAttrReturned++ + key = z.buf[x[0].start:x[0].end] + val = z.buf[x[1].start:x[1].end] + return lower(key), unescape(convertNewlines(val), true), z.nAttrReturned < len(z.attr) + } + } + return nil, nil, false +} + +// Token returns the current Token. The result's Data and Attr values remain +// valid after subsequent Next calls. +func (z *Tokenizer) Token() Token { + t := Token{Type: z.tt} + switch z.tt { + case TextToken, CommentToken, DoctypeToken: + t.Data = string(z.Text()) + case StartTagToken, SelfClosingTagToken, EndTagToken: + name, moreAttr := z.TagName() + for moreAttr { + var key, val []byte + key, val, moreAttr = z.TagAttr() + t.Attr = append(t.Attr, Attribute{"", atom.String(key), string(val)}) + } + if a := atom.Lookup(name); a != 0 { + t.DataAtom, t.Data = a, a.String() + } else { + t.DataAtom, t.Data = 0, string(name) + } + } + return t +} + +// SetMaxBuf sets a limit on the amount of data buffered during tokenization. +// A value of 0 means unlimited. +func (z *Tokenizer) SetMaxBuf(n int) { + z.maxBuf = n +} + +// NewTokenizer returns a new HTML Tokenizer for the given Reader. +// The input is assumed to be UTF-8 encoded. +func NewTokenizer(r io.Reader) *Tokenizer { + return NewTokenizerFragment(r, "") +} + +// NewTokenizerFragment returns a new HTML Tokenizer for the given Reader, for +// tokenizing an existing element's InnerHTML fragment. contextTag is that +// element's tag, such as "div" or "iframe". +// +// For example, how the InnerHTML "a<b" is tokenized depends on whether it is +// for a <p> tag or a <script> tag. +// +// The input is assumed to be UTF-8 encoded. +func NewTokenizerFragment(r io.Reader, contextTag string) *Tokenizer { + z := &Tokenizer{ + r: r, + buf: make([]byte, 0, 4096), + } + if contextTag != "" { + switch s := strings.ToLower(contextTag); s { + case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "title", "textarea", "xmp": + z.rawTag = s + } + } + return z +} diff --git a/vendor/gopkg.in/yaml.v3/apic.go b/vendor/gopkg.in/yaml.v3/apic.go index 05fd305d..ae7d049f 100644 --- a/vendor/gopkg.in/yaml.v3/apic.go +++ b/vendor/gopkg.in/yaml.v3/apic.go @@ -1,17 +1,17 @@ -// +// // Copyright (c) 2011-2019 Canonical Ltd // Copyright (c) 2006-2010 Kirill Simonov -// +// // 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 diff --git a/vendor/gopkg.in/yaml.v3/emitterc.go b/vendor/gopkg.in/yaml.v3/emitterc.go index dde20e50..0f47c9ca 100644 --- a/vendor/gopkg.in/yaml.v3/emitterc.go +++ b/vendor/gopkg.in/yaml.v3/emitterc.go @@ -162,9 +162,10 @@ func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { // Check if we need to accumulate more events before emitting. // // We accumulate extra -// - 1 event for DOCUMENT-START -// - 2 events for SEQUENCE-START -// - 3 events for MAPPING-START +// - 1 event for DOCUMENT-START +// - 2 events for SEQUENCE-START +// - 3 events for MAPPING-START +// func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { if emitter.events_head == len(emitter.events) { return true @@ -240,7 +241,7 @@ func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool emitter.indent += 2 } else { // Everything else aligns to the chosen indentation. - emitter.indent = emitter.best_indent * ((emitter.indent + emitter.best_indent) / emitter.best_indent) + emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent) } } return true diff --git a/vendor/gopkg.in/yaml.v3/parserc.go b/vendor/gopkg.in/yaml.v3/parserc.go index 25fe8236..268558a0 100644 --- a/vendor/gopkg.in/yaml.v3/parserc.go +++ b/vendor/gopkg.in/yaml.v3/parserc.go @@ -227,8 +227,7 @@ func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool // Parse the production: // stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// -// ************ +// ************ func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -250,12 +249,9 @@ func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) // Parse the productions: // implicit_document ::= block_node DOCUMENT-END* -// -// * -// +// * // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// -// ************************* +// ************************* func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { token := peek_token(parser) @@ -360,8 +356,8 @@ func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t // Parse the productions: // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// *********** // -// *********** func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -383,10 +379,9 @@ func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event // Parse the productions: // implicit_document ::= block_node DOCUMENT-END* -// -// ************* -// +// ************* // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -433,41 +428,30 @@ func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) // Parse the productions: // block_node_or_indentless_sequence ::= -// -// ALIAS -// ***** -// | properties (block_content | indentless_block_sequence)? -// ********** * -// | block_content | indentless_block_sequence -// * -// +// ALIAS +// ***** +// | properties (block_content | indentless_block_sequence)? +// ********** * +// | block_content | indentless_block_sequence +// * // block_node ::= ALIAS -// -// ***** -// | properties block_content? -// ********** * -// | block_content -// * -// +// ***** +// | properties block_content? +// ********** * +// | block_content +// * // flow_node ::= ALIAS -// -// ***** -// | properties flow_content? -// ********** * -// | flow_content -// * -// +// ***** +// | properties flow_content? +// ********** * +// | flow_content +// * // properties ::= TAG ANCHOR? | ANCHOR TAG? -// -// ************************* -// +// ************************* // block_content ::= block_collection | flow_collection | SCALAR -// -// ****** -// +// ****** // flow_content ::= flow_collection | SCALAR -// -// ****** +// ****** func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() @@ -698,8 +682,8 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i // Parse the productions: // block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// ******************** *********** * ********* // -// ******************** *********** * ********* func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) @@ -756,8 +740,7 @@ func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_e // Parse the productions: // indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// -// *********** * +// *********** * func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -822,14 +805,14 @@ func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { // Parse the productions: // block_mapping ::= BLOCK-MAPPING_START +// ******************* +// ((KEY block_node_or_indentless_sequence?)? +// *** * +// (VALUE block_node_or_indentless_sequence?)?)* // -// ******************* -// ((KEY block_node_or_indentless_sequence?)? -// *** * -// (VALUE block_node_or_indentless_sequence?)?)* +// BLOCK-END +// ********* // -// BLOCK-END -// ********* func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) @@ -898,11 +881,13 @@ func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_even // Parse the productions: // block_mapping ::= BLOCK-MAPPING_START // -// ((KEY block_node_or_indentless_sequence?)? +// ((KEY block_node_or_indentless_sequence?)? +// +// (VALUE block_node_or_indentless_sequence?)?)* +// ***** * +// BLOCK-END +// // -// (VALUE block_node_or_indentless_sequence?)?)* -// ***** * -// BLOCK-END func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -930,18 +915,16 @@ func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_ev // Parse the productions: // flow_sequence ::= FLOW-SEQUENCE-START -// -// ******************* -// (flow_sequence_entry FLOW-ENTRY)* -// * ********** -// flow_sequence_entry? -// * -// FLOW-SEQUENCE-END -// ***************** -// +// ******************* +// (flow_sequence_entry FLOW-ENTRY)* +// * ********** +// flow_sequence_entry? +// * +// FLOW-SEQUENCE-END +// ***************** // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * // -// * func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) @@ -1004,10 +987,11 @@ func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_ev return true } +// // Parse the productions: // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// *** * // -// *** * func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -1027,8 +1011,8 @@ func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, ev // Parse the productions: // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// ***** * // -// ***** * func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -1051,8 +1035,8 @@ func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, // Parse the productions: // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * // -// * func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -1069,17 +1053,16 @@ func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, ev // Parse the productions: // flow_mapping ::= FLOW-MAPPING-START -// -// ****************** -// (flow_mapping_entry FLOW-ENTRY)* -// * ********** -// flow_mapping_entry? -// ****************** -// FLOW-MAPPING-END -// **************** -// +// ****************** +// (flow_mapping_entry FLOW-ENTRY)* +// * ********** +// flow_mapping_entry? +// ****************** +// FLOW-MAPPING-END +// **************** // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// - *** * +// * *** * +// func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) @@ -1145,7 +1128,8 @@ func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event // Parse the productions: // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// - ***** * +// * ***** * +// func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { token := peek_token(parser) if token == nil { diff --git a/vendor/gopkg.in/yaml.v3/readerc.go b/vendor/gopkg.in/yaml.v3/readerc.go index 56af2453..b7de0a89 100644 --- a/vendor/gopkg.in/yaml.v3/readerc.go +++ b/vendor/gopkg.in/yaml.v3/readerc.go @@ -1,17 +1,17 @@ -// +// // Copyright (c) 2011-2019 Canonical Ltd // Copyright (c) 2006-2010 Kirill Simonov -// +// // 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 diff --git a/vendor/gopkg.in/yaml.v3/scannerc.go b/vendor/gopkg.in/yaml.v3/scannerc.go index 30b1f089..ca007010 100644 --- a/vendor/gopkg.in/yaml.v3/scannerc.go +++ b/vendor/gopkg.in/yaml.v3/scannerc.go @@ -1614,11 +1614,11 @@ func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { // Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. // // Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // -// %YAML 1.1 # a comment \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { // Eat '%'. start_mark := parser.mark @@ -1719,11 +1719,11 @@ func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool // Scan the directive name. // // Scope: +// %YAML 1.1 # a comment \n +// ^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^ // -// %YAML 1.1 # a comment \n -// ^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^ func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { // Consume the directive name. if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { @@ -1758,9 +1758,8 @@ func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark // Scan the value of VERSION-DIRECTIVE. // // Scope: -// -// %YAML 1.1 # a comment \n -// ^^^^^^ +// %YAML 1.1 # a comment \n +// ^^^^^^ func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { // Eat whitespaces. if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { @@ -1798,11 +1797,10 @@ const max_number_length = 2 // Scan the version number of VERSION-DIRECTIVE. // // Scope: -// -// %YAML 1.1 # a comment \n -// ^ -// %YAML 1.1 # a comment \n -// ^ +// %YAML 1.1 # a comment \n +// ^ +// %YAML 1.1 # a comment \n +// ^ func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { // Repeat while the next character is digit. @@ -1836,9 +1834,9 @@ func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark // Scan the value of a TAG-DIRECTIVE token. // // Scope: +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { var handle_value, prefix_value []byte @@ -2849,7 +2847,7 @@ func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t continue } if parser.buffer[parser.buffer_pos+peek] == '#' { - seen := parser.mark.index + peek + seen := parser.mark.index+peek for { if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { return false @@ -2878,7 +2876,7 @@ func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t parser.comments = append(parser.comments, yaml_comment_t{ token_mark: token_mark, start_mark: start_mark, - line: text, + line: text, }) } return true @@ -2912,7 +2910,7 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo // the foot is the line below it. var foot_line = -1 if scan_mark.line > 0 { - foot_line = parser.mark.line - parser.newlines + 1 + foot_line = parser.mark.line-parser.newlines+1 if parser.newlines == 0 && parser.mark.column > 1 { foot_line++ } @@ -2998,7 +2996,7 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo recent_empty = false // Consume until after the consumed comment line. - seen := parser.mark.index + peek + seen := parser.mark.index+peek for { if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { return false diff --git a/vendor/gopkg.in/yaml.v3/writerc.go b/vendor/gopkg.in/yaml.v3/writerc.go index 266d0b09..b8a116bf 100644 --- a/vendor/gopkg.in/yaml.v3/writerc.go +++ b/vendor/gopkg.in/yaml.v3/writerc.go @@ -1,17 +1,17 @@ -// +// // Copyright (c) 2011-2019 Canonical Ltd // Copyright (c) 2006-2010 Kirill Simonov -// +// // 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 diff --git a/vendor/gopkg.in/yaml.v3/yaml.go b/vendor/gopkg.in/yaml.v3/yaml.go index f0bedf3d..8cec6da4 100644 --- a/vendor/gopkg.in/yaml.v3/yaml.go +++ b/vendor/gopkg.in/yaml.v3/yaml.go @@ -17,7 +17,8 @@ // // Source code and other details for the project are available at GitHub: // -// https://github.com/go-yaml/yaml +// https://github.com/go-yaml/yaml +// package yaml import ( @@ -74,15 +75,16 @@ type Marshaler interface { // // For example: // -// type T struct { -// F int `yaml:"a,omitempty"` -// B int -// } -// var t T -// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// var t T +// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) // // See the documentation of Marshal for the format of tags and a list of // supported tag options. +// func Unmarshal(in []byte, out interface{}) (err error) { return unmarshal(in, out, false) } @@ -183,35 +185,36 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) { // // The field tag format accepted is: // -// `(...) yaml:"[<key>][,<flag1>[,<flag2>]]" (...)` +// `(...) yaml:"[<key>][,<flag1>[,<flag2>]]" (...)` // // The following flags are currently supported: // -// omitempty Only include the field if it's not set to the zero -// value for the type or to empty slices or maps. -// Zero valued structs will be omitted if all their public -// fields are zero, unless they implement an IsZero -// method (see the IsZeroer interface type), in which -// case the field will be excluded if IsZero returns true. +// omitempty Only include the field if it's not set to the zero +// value for the type or to empty slices or maps. +// Zero valued structs will be omitted if all their public +// fields are zero, unless they implement an IsZero +// method (see the IsZeroer interface type), in which +// case the field will be excluded if IsZero returns true. // -// flow Marshal using a flow style (useful for structs, -// sequences and maps). +// flow Marshal using a flow style (useful for structs, +// sequences and maps). // -// inline Inline the field, which must be a struct or a map, -// causing all of its fields or keys to be processed as if -// they were part of the outer struct. For maps, keys must -// not conflict with the yaml keys of other struct fields. +// inline Inline the field, which must be a struct or a map, +// causing all of its fields or keys to be processed as if +// they were part of the outer struct. For maps, keys must +// not conflict with the yaml keys of other struct fields. // // In addition, if the key is "-", the field is ignored. // // For example: // -// type T struct { -// F int `yaml:"a,omitempty"` -// B int -// } -// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" -// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" +// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" +// func Marshal(in interface{}) (out []byte, err error) { defer handleErr(&err) e := newEncoder() @@ -355,21 +358,22 @@ const ( // // For example: // -// var person struct { -// Name string -// Address yaml.Node -// } -// err := yaml.Unmarshal(data, &person) -// +// var person struct { +// Name string +// Address yaml.Node +// } +// err := yaml.Unmarshal(data, &person) +// // Or by itself: // -// var person Node -// err := yaml.Unmarshal(data, &person) +// var person Node +// err := yaml.Unmarshal(data, &person) +// type Node struct { // Kind defines whether the node is a document, a mapping, a sequence, // a scalar value, or an alias to another node. The specific data type of // scalar nodes may be obtained via the ShortTag and LongTag methods. - Kind Kind + Kind Kind // Style allows customizing the apperance of the node in the tree. Style Style @@ -417,6 +421,7 @@ func (n *Node) IsZero() bool { n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0 } + // LongTag returns the long form of the tag that indicates the data type for // the node. If the Tag field isn't explicitly defined, one will be computed // based on the node properties. diff --git a/vendor/gopkg.in/yaml.v3/yamlh.go b/vendor/gopkg.in/yaml.v3/yamlh.go index ddcd5513..7c6d0077 100644 --- a/vendor/gopkg.in/yaml.v3/yamlh.go +++ b/vendor/gopkg.in/yaml.v3/yamlh.go @@ -438,9 +438,7 @@ type yaml_document_t struct { // The number of written bytes should be set to the size_read variable. // // [in,out] data A pointer to an application data specified by -// -// yaml_parser_set_input(). -// +// yaml_parser_set_input(). // [out] buffer The buffer to write the data from the source. // [in] size The size of the buffer. // [out] size_read The actual number of bytes read from the source. @@ -641,6 +639,7 @@ type yaml_parser_t struct { } type yaml_comment_t struct { + scan_mark yaml_mark_t // Position where scanning for comments started token_mark yaml_mark_t // Position after which tokens will be associated with this comment start_mark yaml_mark_t // Position of '#' comment mark @@ -660,14 +659,13 @@ type yaml_comment_t struct { // @a buffer to the output. // // @param[in,out] data A pointer to an application data specified by -// -// yaml_emitter_set_output(). -// +// yaml_emitter_set_output(). // @param[in] buffer The buffer with bytes to be written. // @param[in] size The size of the buffer. // // @returns On success, the handler should return @c 1. If the handler failed, // the returned value should be @c 0. +// type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error type yaml_emitter_state_t int diff --git a/vendor/gopkg.in/yaml.v3/yamlprivateh.go b/vendor/gopkg.in/yaml.v3/yamlprivateh.go index dea1ba96..e88f9c54 100644 --- a/vendor/gopkg.in/yaml.v3/yamlprivateh.go +++ b/vendor/gopkg.in/yaml.v3/yamlprivateh.go @@ -1,17 +1,17 @@ -// +// // Copyright (c) 2011-2019 Canonical Ltd // Copyright (c) 2006-2010 Kirill Simonov -// +// // 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 @@ -137,8 +137,8 @@ func is_crlf(b []byte, i int) bool { func is_breakz(b []byte, i int) bool { //return is_break(b, i) || is_z(b, i) return ( - // is_break: - b[i] == '\r' || // CR (#xD) + // is_break: + b[i] == '\r' || // CR (#xD) b[i] == '\n' || // LF (#xA) b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) @@ -151,8 +151,8 @@ func is_breakz(b []byte, i int) bool { func is_spacez(b []byte, i int) bool { //return is_space(b, i) || is_breakz(b, i) return ( - // is_space: - b[i] == ' ' || + // is_space: + b[i] == ' ' || // is_breakz: b[i] == '\r' || // CR (#xD) b[i] == '\n' || // LF (#xA) @@ -166,8 +166,8 @@ func is_spacez(b []byte, i int) bool { func is_blankz(b []byte, i int) bool { //return is_blank(b, i) || is_breakz(b, i) return ( - // is_blank: - b[i] == ' ' || b[i] == '\t' || + // is_blank: + b[i] == ' ' || b[i] == '\t' || // is_breakz: b[i] == '\r' || // CR (#xD) b[i] == '\n' || // LF (#xA) diff --git a/vendor/modules.txt b/vendor/modules.txt index 77d95416..5e16faa0 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -174,6 +174,12 @@ github.com/docker/go-units # github.com/felixge/httpsnoop v1.0.4 ## explicit; go 1.13 github.com/felixge/httpsnoop +# github.com/gabriel-vasile/mimetype v1.4.3 +## explicit; go 1.20 +github.com/gabriel-vasile/mimetype +github.com/gabriel-vasile/mimetype/internal/charset +github.com/gabriel-vasile/mimetype/internal/json +github.com/gabriel-vasile/mimetype/internal/magic # github.com/go-logr/logr v1.4.2 ## explicit; go 1.18 github.com/go-logr/logr @@ -185,6 +191,16 @@ github.com/go-logr/stdr ## explicit; go 1.12 github.com/go-ole/go-ole github.com/go-ole/go-ole/oleutil +# github.com/go-playground/locales v0.14.1 +## explicit; go 1.17 +github.com/go-playground/locales +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.23.0 +## explicit; go 1.18 +github.com/go-playground/validator/v10 # github.com/gogo/protobuf v1.3.2 ## explicit; go 1.15 github.com/gogo/protobuf/proto @@ -248,6 +264,10 @@ github.com/klauspost/compress/internal/cpuinfo github.com/klauspost/compress/internal/snapref github.com/klauspost/compress/zstd github.com/klauspost/compress/zstd/internal/xxhash +# github.com/leodido/go-urn v1.4.0 +## explicit; go 1.18 +github.com/leodido/go-urn +github.com/leodido/go-urn/scim/schema # github.com/lib/pq v1.10.9 ## explicit; go 1.13 github.com/lib/pq @@ -423,10 +443,13 @@ golang.org/x/crypto/curve25519 golang.org/x/crypto/internal/alias golang.org/x/crypto/internal/poly1305 golang.org/x/crypto/pbkdf2 +golang.org/x/crypto/sha3 golang.org/x/crypto/ssh golang.org/x/crypto/ssh/internal/bcrypt_pbkdf # golang.org/x/net v0.32.0 ## explicit; go 1.18 +golang.org/x/net/html +golang.org/x/net/html/atom golang.org/x/net/http/httpguts golang.org/x/net/http2 golang.org/x/net/http2/hpack